@formo/analytics 1.16.0 → 1.16.2

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 (281) hide show
  1. package/dist/cjs/src/FormoAnalytics.d.ts +20 -14
  2. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
  3. package/dist/cjs/src/FormoAnalytics.js +105 -136
  4. package/dist/cjs/src/FormoAnalytics.js.map +1 -1
  5. package/dist/cjs/src/FormoAnalyticsProvider.d.ts +1 -1
  6. package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
  7. package/dist/cjs/src/FormoAnalyticsProvider.js +4 -4
  8. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
  9. package/dist/cjs/src/constants/config.d.ts +597 -597
  10. package/dist/cjs/src/constants/config.d.ts.map +1 -1
  11. package/dist/cjs/src/constants/config.js.map +1 -1
  12. package/dist/cjs/src/constants/index.d.ts +0 -1
  13. package/dist/cjs/src/constants/index.d.ts.map +1 -1
  14. package/dist/cjs/src/constants/index.js +0 -1
  15. package/dist/cjs/src/constants/index.js.map +1 -1
  16. package/dist/cjs/src/lib/event/EventFactory.d.ts +62 -0
  17. package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/event/EventFactory.js +188 -0
  19. package/dist/cjs/src/lib/event/EventFactory.js.map +1 -0
  20. package/dist/cjs/src/lib/event/index.d.ts +3 -0
  21. package/dist/cjs/src/lib/event/index.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/event/index.js +19 -0
  23. package/dist/cjs/src/lib/event/index.js.map +1 -0
  24. package/dist/cjs/src/lib/event/type.d.ts +6 -0
  25. package/dist/cjs/src/lib/event/type.d.ts.map +1 -0
  26. package/dist/cjs/src/lib/event/type.js +3 -0
  27. package/dist/cjs/src/lib/event/type.js.map +1 -0
  28. package/dist/cjs/src/lib/index.d.ts +1 -0
  29. package/dist/cjs/src/lib/index.d.ts.map +1 -1
  30. package/dist/cjs/src/lib/index.js +1 -0
  31. package/dist/cjs/src/lib/index.js.map +1 -1
  32. package/dist/cjs/src/lib/{logger.d.ts → logger/Logger.d.ts} +5 -5
  33. package/dist/cjs/src/lib/logger/Logger.d.ts.map +1 -0
  34. package/dist/cjs/src/lib/{logger.js → logger/Logger.js} +1 -1
  35. package/dist/cjs/src/lib/logger/Logger.js.map +1 -0
  36. package/dist/cjs/src/lib/logger/index.d.ts +3 -0
  37. package/dist/cjs/src/lib/logger/index.d.ts.map +1 -0
  38. package/dist/cjs/src/lib/logger/index.js +19 -0
  39. package/dist/cjs/src/lib/logger/index.js.map +1 -0
  40. package/dist/cjs/src/lib/logger/type.d.ts +14 -0
  41. package/dist/cjs/src/lib/logger/type.d.ts.map +1 -0
  42. package/dist/cjs/src/lib/logger/type.js +3 -0
  43. package/dist/cjs/src/lib/logger/type.js.map +1 -0
  44. package/dist/{esm/src/lib/queue.d.ts → cjs/src/lib/queue/EventQueue.d.ts} +5 -4
  45. package/dist/cjs/src/lib/queue/EventQueue.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/{queue.js → queue/EventQueue.js} +9 -6
  47. package/dist/cjs/src/lib/queue/EventQueue.js.map +1 -0
  48. package/dist/cjs/src/lib/queue/index.d.ts +3 -0
  49. package/dist/cjs/src/lib/queue/index.d.ts.map +1 -0
  50. package/dist/cjs/src/lib/queue/index.js +19 -0
  51. package/dist/cjs/src/lib/queue/index.js.map +1 -0
  52. package/dist/cjs/src/lib/queue/type.d.ts +6 -0
  53. package/dist/cjs/src/lib/queue/type.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/queue/type.js +3 -0
  55. package/dist/cjs/src/lib/queue/type.js.map +1 -0
  56. package/dist/cjs/src/types/base.d.ts +1 -0
  57. package/dist/cjs/src/types/base.d.ts.map +1 -1
  58. package/dist/cjs/src/types/events.d.ts +44 -2
  59. package/dist/cjs/src/types/events.d.ts.map +1 -1
  60. package/dist/cjs/src/types/events.js.map +1 -1
  61. package/dist/cjs/src/utils/address.d.ts +3 -0
  62. package/dist/cjs/src/utils/address.d.ts.map +1 -0
  63. package/dist/cjs/src/utils/address.js +32 -0
  64. package/dist/cjs/src/utils/address.js.map +1 -0
  65. package/dist/cjs/src/utils/base.d.ts +0 -7
  66. package/dist/cjs/src/utils/base.d.ts.map +1 -1
  67. package/dist/cjs/src/utils/base.js +1 -106
  68. package/dist/cjs/src/utils/base.js.map +1 -1
  69. package/dist/cjs/src/utils/converter.d.ts +5 -0
  70. package/dist/cjs/src/utils/converter.d.ts.map +1 -0
  71. package/dist/cjs/src/utils/converter.js +52 -0
  72. package/dist/cjs/src/utils/converter.js.map +1 -0
  73. package/dist/cjs/src/utils/generate.d.ts +4 -0
  74. package/dist/cjs/src/utils/generate.d.ts.map +1 -0
  75. package/dist/cjs/src/utils/generate.js +60 -0
  76. package/dist/cjs/src/utils/generate.js.map +1 -0
  77. package/dist/cjs/src/utils/index.d.ts +3 -1
  78. package/dist/cjs/src/utils/index.d.ts.map +1 -1
  79. package/dist/cjs/src/utils/index.js +3 -1
  80. package/dist/cjs/src/utils/index.js.map +1 -1
  81. package/dist/cjs/src/validators/address.d.ts +5 -0
  82. package/dist/cjs/src/validators/address.d.ts.map +1 -0
  83. package/dist/cjs/src/validators/address.js +64 -0
  84. package/dist/cjs/src/validators/address.js.map +1 -0
  85. package/dist/cjs/src/validators/agent.d.ts +2 -0
  86. package/dist/cjs/src/validators/agent.d.ts.map +1 -0
  87. package/dist/cjs/src/{utils/is.js → validators/agent.js} +2 -5
  88. package/dist/cjs/src/validators/agent.js.map +1 -0
  89. package/dist/cjs/src/validators/index.d.ts +7 -0
  90. package/dist/cjs/src/validators/index.d.ts.map +1 -0
  91. package/dist/cjs/src/validators/index.js +23 -0
  92. package/dist/cjs/src/validators/index.js.map +1 -0
  93. package/dist/cjs/src/validators/object.d.ts +2 -0
  94. package/dist/cjs/src/validators/object.d.ts.map +1 -0
  95. package/dist/cjs/src/validators/object.js +10 -0
  96. package/dist/cjs/src/validators/object.js.map +1 -0
  97. package/dist/cjs/src/validators/string.d.ts +3 -0
  98. package/dist/cjs/src/validators/string.d.ts.map +1 -0
  99. package/dist/cjs/src/validators/string.js +8 -0
  100. package/dist/cjs/src/validators/string.js.map +1 -0
  101. package/dist/cjs/src/validators/type-check.d.ts +14 -0
  102. package/dist/cjs/src/validators/type-check.d.ts.map +1 -0
  103. package/dist/cjs/src/validators/type-check.js +61 -0
  104. package/dist/cjs/src/validators/type-check.js.map +1 -0
  105. package/dist/cjs/src/validators/uint8array.d.ts +3 -0
  106. package/dist/cjs/src/validators/uint8array.d.ts.map +1 -0
  107. package/dist/cjs/src/validators/uint8array.js +21 -0
  108. package/dist/cjs/src/validators/uint8array.js.map +1 -0
  109. package/dist/cjs/test/lib.spec.js +9 -2
  110. package/dist/cjs/test/lib.spec.js.map +1 -1
  111. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  112. package/dist/esm/src/FormoAnalytics.d.ts +20 -14
  113. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
  114. package/dist/esm/src/FormoAnalytics.js +102 -133
  115. package/dist/esm/src/FormoAnalytics.js.map +1 -1
  116. package/dist/esm/src/FormoAnalyticsProvider.d.ts +1 -1
  117. package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
  118. package/dist/esm/src/FormoAnalyticsProvider.js +2 -2
  119. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
  120. package/dist/esm/src/constants/config.d.ts +597 -597
  121. package/dist/esm/src/constants/config.d.ts.map +1 -1
  122. package/dist/esm/src/constants/config.js.map +1 -1
  123. package/dist/esm/src/constants/index.d.ts +0 -1
  124. package/dist/esm/src/constants/index.d.ts.map +1 -1
  125. package/dist/esm/src/constants/index.js +0 -1
  126. package/dist/esm/src/constants/index.js.map +1 -1
  127. package/dist/esm/src/lib/event/EventFactory.d.ts +62 -0
  128. package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -0
  129. package/dist/esm/src/lib/event/EventFactory.js +185 -0
  130. package/dist/esm/src/lib/event/EventFactory.js.map +1 -0
  131. package/dist/esm/src/lib/event/index.d.ts +3 -0
  132. package/dist/esm/src/lib/event/index.d.ts.map +1 -0
  133. package/dist/esm/src/lib/event/index.js +3 -0
  134. package/dist/esm/src/lib/event/index.js.map +1 -0
  135. package/dist/esm/src/lib/event/type.d.ts +6 -0
  136. package/dist/esm/src/lib/event/type.d.ts.map +1 -0
  137. package/dist/esm/src/lib/event/type.js +2 -0
  138. package/dist/esm/src/lib/event/type.js.map +1 -0
  139. package/dist/esm/src/lib/fetch.d.ts +1 -1
  140. package/dist/esm/src/lib/index.d.ts +1 -0
  141. package/dist/esm/src/lib/index.d.ts.map +1 -1
  142. package/dist/esm/src/lib/index.js +1 -0
  143. package/dist/esm/src/lib/index.js.map +1 -1
  144. package/dist/esm/src/lib/{logger.d.ts → logger/Logger.d.ts} +5 -5
  145. package/dist/esm/src/lib/logger/Logger.d.ts.map +1 -0
  146. package/dist/esm/src/lib/{logger.js → logger/Logger.js} +1 -1
  147. package/dist/esm/src/lib/logger/Logger.js.map +1 -0
  148. package/dist/esm/src/lib/logger/index.d.ts +3 -0
  149. package/dist/esm/src/lib/logger/index.d.ts.map +1 -0
  150. package/dist/esm/src/lib/logger/index.js +3 -0
  151. package/dist/esm/src/lib/logger/index.js.map +1 -0
  152. package/dist/esm/src/lib/logger/type.d.ts +14 -0
  153. package/dist/esm/src/lib/logger/type.d.ts.map +1 -0
  154. package/dist/esm/src/lib/logger/type.js +2 -0
  155. package/dist/esm/src/lib/logger/type.js.map +1 -0
  156. package/dist/{cjs/src/lib/queue.d.ts → esm/src/lib/queue/EventQueue.d.ts} +5 -4
  157. package/dist/esm/src/lib/queue/EventQueue.d.ts.map +1 -0
  158. package/dist/esm/src/lib/{queue.js → queue/EventQueue.js} +9 -6
  159. package/dist/esm/src/lib/queue/EventQueue.js.map +1 -0
  160. package/dist/esm/src/lib/queue/index.d.ts +3 -0
  161. package/dist/esm/src/lib/queue/index.d.ts.map +1 -0
  162. package/dist/esm/src/lib/queue/index.js +3 -0
  163. package/dist/esm/src/lib/queue/index.js.map +1 -0
  164. package/dist/esm/src/lib/queue/type.d.ts +6 -0
  165. package/dist/esm/src/lib/queue/type.d.ts.map +1 -0
  166. package/dist/esm/src/lib/queue/type.js +2 -0
  167. package/dist/esm/src/lib/queue/type.js.map +1 -0
  168. package/dist/esm/src/types/base.d.ts +1 -0
  169. package/dist/esm/src/types/base.d.ts.map +1 -1
  170. package/dist/esm/src/types/events.d.ts +44 -2
  171. package/dist/esm/src/types/events.d.ts.map +1 -1
  172. package/dist/esm/src/types/events.js.map +1 -1
  173. package/dist/esm/src/utils/address.d.ts +3 -0
  174. package/dist/esm/src/utils/address.d.ts.map +1 -0
  175. package/dist/esm/src/utils/address.js +28 -0
  176. package/dist/esm/src/utils/address.js.map +1 -0
  177. package/dist/esm/src/utils/base.d.ts +0 -7
  178. package/dist/esm/src/utils/base.d.ts.map +1 -1
  179. package/dist/esm/src/utils/base.js +0 -99
  180. package/dist/esm/src/utils/base.js.map +1 -1
  181. package/dist/esm/src/utils/converter.d.ts +5 -0
  182. package/dist/esm/src/utils/converter.d.ts.map +1 -0
  183. package/dist/esm/src/utils/converter.js +45 -0
  184. package/dist/esm/src/utils/converter.js.map +1 -0
  185. package/dist/esm/src/utils/generate.d.ts +4 -0
  186. package/dist/esm/src/utils/generate.d.ts.map +1 -0
  187. package/dist/esm/src/utils/generate.js +56 -0
  188. package/dist/esm/src/utils/generate.js.map +1 -0
  189. package/dist/esm/src/utils/index.d.ts +3 -1
  190. package/dist/esm/src/utils/index.d.ts.map +1 -1
  191. package/dist/esm/src/utils/index.js +3 -1
  192. package/dist/esm/src/utils/index.js.map +1 -1
  193. package/dist/esm/src/validators/address.d.ts +5 -0
  194. package/dist/esm/src/validators/address.d.ts.map +1 -0
  195. package/dist/esm/src/validators/address.js +58 -0
  196. package/dist/esm/src/validators/address.js.map +1 -0
  197. package/dist/esm/src/validators/agent.d.ts +2 -0
  198. package/dist/esm/src/validators/agent.d.ts.map +1 -0
  199. package/dist/esm/src/{utils/is.js → validators/agent.js} +1 -3
  200. package/dist/esm/src/validators/agent.js.map +1 -0
  201. package/dist/esm/src/validators/index.d.ts +7 -0
  202. package/dist/esm/src/validators/index.d.ts.map +1 -0
  203. package/dist/esm/src/validators/index.js +7 -0
  204. package/dist/esm/src/validators/index.js.map +1 -0
  205. package/dist/esm/src/validators/object.d.ts +2 -0
  206. package/dist/esm/src/validators/object.d.ts.map +1 -0
  207. package/dist/esm/src/validators/object.js +6 -0
  208. package/dist/esm/src/validators/object.js.map +1 -0
  209. package/dist/esm/src/validators/string.d.ts +3 -0
  210. package/dist/esm/src/validators/string.d.ts.map +1 -0
  211. package/dist/esm/src/validators/string.js +4 -0
  212. package/dist/esm/src/validators/string.js.map +1 -0
  213. package/dist/esm/src/validators/type-check.d.ts +14 -0
  214. package/dist/esm/src/validators/type-check.d.ts.map +1 -0
  215. package/dist/esm/src/validators/type-check.js +46 -0
  216. package/dist/esm/src/validators/type-check.js.map +1 -0
  217. package/dist/esm/src/validators/uint8array.d.ts +3 -0
  218. package/dist/esm/src/validators/uint8array.d.ts.map +1 -0
  219. package/dist/esm/src/validators/uint8array.js +17 -0
  220. package/dist/esm/src/validators/uint8array.js.map +1 -0
  221. package/dist/esm/test/lib.spec.js +8 -1
  222. package/dist/esm/test/lib.spec.js.map +1 -1
  223. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  224. package/dist/index.umd.min.js +1 -1
  225. package/dist/index.umd.min.js.LICENSE.txt +4 -0
  226. package/dist/index.umd.min.js.map +1 -1
  227. package/package.json +14 -3
  228. package/src/FormoAnalytics.ts +106 -162
  229. package/src/FormoAnalyticsProvider.tsx +2 -2
  230. package/src/constants/config.ts +1 -1
  231. package/src/constants/index.ts +0 -1
  232. package/src/global.d.ts +4 -4
  233. package/src/lib/event/EventFactory.ts +263 -0
  234. package/src/lib/event/index.ts +2 -0
  235. package/src/lib/event/type.ts +11 -0
  236. package/src/lib/index.ts +1 -0
  237. package/src/lib/{logger.ts → logger/Logger.ts} +4 -4
  238. package/src/lib/logger/index.ts +2 -0
  239. package/src/lib/logger/type.ts +14 -0
  240. package/src/lib/{queue.ts → queue/EventQueue.ts} +13 -9
  241. package/src/lib/queue/index.ts +2 -0
  242. package/src/lib/queue/type.ts +6 -0
  243. package/src/types/base.ts +2 -0
  244. package/src/types/events.ts +53 -2
  245. package/src/utils/address.ts +43 -0
  246. package/src/utils/base.ts +0 -62
  247. package/src/utils/converter.ts +44 -0
  248. package/src/utils/generate.ts +16 -0
  249. package/src/utils/index.ts +3 -1
  250. package/src/validators/address.ts +69 -0
  251. package/src/{utils/is.ts → validators/agent.ts} +0 -4
  252. package/src/validators/index.ts +6 -0
  253. package/src/validators/object.ts +4 -0
  254. package/src/validators/string.ts +4 -0
  255. package/src/validators/type-check.ts +61 -0
  256. package/src/validators/uint8array.ts +17 -0
  257. package/test/lib.spec.ts +13 -1
  258. package/webpack.config.ts +12 -12
  259. package/dist/cjs/src/constants/regex.d.ts +0 -4
  260. package/dist/cjs/src/constants/regex.d.ts.map +0 -1
  261. package/dist/cjs/src/constants/regex.js +0 -7
  262. package/dist/cjs/src/constants/regex.js.map +0 -1
  263. package/dist/cjs/src/lib/logger.d.ts.map +0 -1
  264. package/dist/cjs/src/lib/logger.js.map +0 -1
  265. package/dist/cjs/src/lib/queue.d.ts.map +0 -1
  266. package/dist/cjs/src/lib/queue.js.map +0 -1
  267. package/dist/cjs/src/utils/is.d.ts +0 -3
  268. package/dist/cjs/src/utils/is.d.ts.map +0 -1
  269. package/dist/cjs/src/utils/is.js.map +0 -1
  270. package/dist/esm/src/constants/regex.d.ts +0 -4
  271. package/dist/esm/src/constants/regex.d.ts.map +0 -1
  272. package/dist/esm/src/constants/regex.js +0 -4
  273. package/dist/esm/src/constants/regex.js.map +0 -1
  274. package/dist/esm/src/lib/logger.d.ts.map +0 -1
  275. package/dist/esm/src/lib/logger.js.map +0 -1
  276. package/dist/esm/src/lib/queue.d.ts.map +0 -1
  277. package/dist/esm/src/lib/queue.js.map +0 -1
  278. package/dist/esm/src/utils/is.d.ts +0 -3
  279. package/dist/esm/src/utils/is.d.ts.map +0 -1
  280. package/dist/esm/src/utils/is.js.map +0 -1
  281. package/src/constants/regex.ts +0 -3
@@ -0,0 +1,263 @@
1
+ import { UUID } from "crypto";
2
+ import { COUNTRY_LIST } from "../../constants";
3
+ import {
4
+ Address,
5
+ APIEvent,
6
+ ChainID,
7
+ SignatureStatus,
8
+ TransactionStatus,
9
+ } from "../../types";
10
+ import { logger } from "../logger";
11
+ import { IEventFactory } from "./type";
12
+ import { toChecksumAddress, toSnakeCase } from "../../utils";
13
+
14
+ class EventFactory implements IEventFactory {
15
+ constructor() {}
16
+
17
+ private getLocation(): string | undefined {
18
+ try {
19
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
20
+ if (timezone in COUNTRY_LIST)
21
+ return COUNTRY_LIST[timezone as keyof typeof COUNTRY_LIST];
22
+ return timezone;
23
+ } catch (error) {
24
+ logger.error("Error resolving timezone:", error);
25
+ return "";
26
+ }
27
+ }
28
+
29
+ private getLanguage(): string {
30
+ try {
31
+ return (
32
+ (navigator.languages && navigator.languages.length
33
+ ? navigator.languages[0]
34
+ : navigator.language) || "en"
35
+ );
36
+ } catch (error) {
37
+ logger.error("Error resolving language:", error);
38
+ return "en";
39
+ }
40
+ }
41
+
42
+ private buildCommonProperties(
43
+ anonymous_id: UUID,
44
+ user_id: string | null,
45
+ address: string | null,
46
+ action: string
47
+ ) {
48
+ // common properties
49
+ return {
50
+ anonymous_id,
51
+ user_id,
52
+ address: address && toChecksumAddress(address),
53
+ timestamp: new Date().toISOString(),
54
+ action,
55
+ version: "1",
56
+ };
57
+ }
58
+
59
+ private buildCommonPayload() {
60
+ const url = new URL(window.location.href);
61
+
62
+ const location = this.getLocation();
63
+ const language = this.getLanguage();
64
+
65
+ // common properties
66
+ return {
67
+ "user-agent": window.navigator.userAgent,
68
+ href: url.href,
69
+ locale: language,
70
+ location,
71
+ };
72
+ }
73
+
74
+ generatePageEvent() {
75
+ const url = new URL(window.location.href);
76
+ const params = new URLSearchParams(url.search);
77
+ const pathname = window.location.pathname;
78
+ const hash = window.location.hash;
79
+
80
+ return {
81
+ pathname: pathname || url.pathname,
82
+ hash: hash || url.hash,
83
+ referrer: document.referrer,
84
+ utm_source: params.get("utm_source")?.trim() || "",
85
+ utm_medium: params.get("utm_medium")?.trim() || "",
86
+ utm_campaign: params.get("utm_campaign")?.trim() || "",
87
+ utm_content: params.get("utm_content")?.trim() || "",
88
+ utm_term: params.get("utm_term")?.trim() || "",
89
+ ref: params.get("ref")?.trim() || "",
90
+ };
91
+ }
92
+
93
+ generateConnectEvent(chainId: ChainID, address: Address) {
94
+ return {
95
+ chainId,
96
+ address,
97
+ };
98
+ }
99
+
100
+ generateDisconnectEvent(chainId: ChainID, address: Address) {
101
+ return {
102
+ chainId,
103
+ address,
104
+ };
105
+ }
106
+
107
+ generateDetectWalletEvent(providerName: string, rdns: string) {
108
+ return {
109
+ providerName,
110
+ rdns,
111
+ };
112
+ }
113
+
114
+ generateIdentifyEvent(
115
+ address: Address | null,
116
+ providerName: string,
117
+ rdns: string
118
+ ) {
119
+ return {
120
+ address,
121
+ providerName,
122
+ rdns,
123
+ };
124
+ }
125
+
126
+ generateChainChangedEvent(chainId: ChainID, address: Address) {
127
+ return {
128
+ chainId,
129
+ address,
130
+ };
131
+ }
132
+
133
+ generateSignatureEvent(
134
+ status: SignatureStatus,
135
+ chainId: ChainID,
136
+ address: Address,
137
+ message: string,
138
+ signatureHash: string
139
+ ) {
140
+ return {
141
+ status,
142
+ chainId,
143
+ address,
144
+ message,
145
+ signatureHash,
146
+ };
147
+ }
148
+
149
+ generateTransactionEvent(
150
+ status: TransactionStatus,
151
+ chainId: ChainID,
152
+ address: Address,
153
+ data: string,
154
+ to: string,
155
+ value: string,
156
+ transactionHash: string
157
+ ) {
158
+ return {
159
+ status,
160
+ chainId,
161
+ address,
162
+ data,
163
+ to,
164
+ value,
165
+ transactionHash,
166
+ };
167
+ }
168
+
169
+ generateCustomEvent(args: any) {
170
+ if (typeof args !== "object") {
171
+ logger.warn("Invalid event data");
172
+ return {};
173
+ }
174
+ const { action, ...rest } = args;
175
+
176
+ return {
177
+ ...rest,
178
+ };
179
+ }
180
+
181
+ create(
182
+ anonymous_id: UUID,
183
+ user_id: string | null,
184
+ address: string | null,
185
+ event: APIEvent
186
+ ) {
187
+ const commonProperties = this.buildCommonProperties(
188
+ anonymous_id,
189
+ user_id,
190
+ address,
191
+ event.action
192
+ );
193
+ const payload = this.buildCommonPayload();
194
+ let eventSpecificPayload = this.generateCustomEvent(event);
195
+ if (event.action === "page_hit") {
196
+ eventSpecificPayload = this.generatePageEvent();
197
+ }
198
+ if (event.action === "connect") {
199
+ eventSpecificPayload = this.generateConnectEvent(
200
+ event.chainId,
201
+ event.address
202
+ );
203
+ }
204
+ if (event.action === "disconnect") {
205
+ eventSpecificPayload = this.generateDisconnectEvent(
206
+ event.chainId,
207
+ event.address
208
+ );
209
+ }
210
+ if (event.action === "detect_wallet") {
211
+ eventSpecificPayload = this.generateDetectWalletEvent(
212
+ event.providerName,
213
+ event.rdns
214
+ );
215
+ }
216
+ if (event.action === "identify") {
217
+ eventSpecificPayload = this.generateIdentifyEvent(
218
+ event.address,
219
+ event.providerName,
220
+ event.rdns
221
+ );
222
+ }
223
+ if (event.action === "chain_changed") {
224
+ eventSpecificPayload = this.generateChainChangedEvent(
225
+ event.chainId,
226
+ event.address
227
+ );
228
+ }
229
+ if (event.action === "signature") {
230
+ eventSpecificPayload = this.generateSignatureEvent(
231
+ event.status,
232
+ event.chainId,
233
+ event.address,
234
+ event.message,
235
+ event.signatureHash
236
+ );
237
+ }
238
+ if (event.action === "transaction") {
239
+ eventSpecificPayload = this.generateTransactionEvent(
240
+ event.status,
241
+ event.chainId,
242
+ event.address,
243
+ event.data,
244
+ event.to,
245
+ event.value,
246
+ event.transactionHash
247
+ );
248
+ }
249
+
250
+ return toSnakeCase(
251
+ {
252
+ ...commonProperties,
253
+ payload: {
254
+ ...payload,
255
+ ...eventSpecificPayload,
256
+ },
257
+ },
258
+ ["user-agent"]
259
+ );
260
+ }
261
+ }
262
+
263
+ export { EventFactory };
@@ -0,0 +1,2 @@
1
+ export * from "./EventFactory";
2
+ export * from "./type";
@@ -0,0 +1,11 @@
1
+ import { UUID } from "crypto";
2
+ import { APIEvent, IFormoEvent } from "../../types";
3
+
4
+ export interface IEventFactory {
5
+ create(
6
+ anonymous_id: UUID,
7
+ user_id: string | null,
8
+ address: string | null,
9
+ event: APIEvent
10
+ ): IFormoEvent;
11
+ }
package/src/lib/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from "./event";
1
2
  export * from "./logger";
2
3
  export * from "./queue";
3
4
  export * from "./storage";
@@ -1,7 +1,7 @@
1
- export type LogLevel = "debug" | "info" | "warn" | "error" | "trace";
1
+ import { ILogger, LogLevel } from "./type";
2
2
 
3
- export class Logger {
4
- private static instance: Logger;
3
+ export class Logger implements ILogger {
4
+ private static instance: ILogger;
5
5
  private enabledLevels: Set<LogLevel>;
6
6
  private enabled: boolean;
7
7
 
@@ -32,7 +32,7 @@ export class Logger {
32
32
  public static getInstance(config?: {
33
33
  enabled?: boolean;
34
34
  enabledLevels?: LogLevel[];
35
- }): Logger {
35
+ }): ILogger {
36
36
  if (!Logger.instance) {
37
37
  Logger.instance = new Logger(
38
38
  config?.enabled ?? false,
@@ -0,0 +1,2 @@
1
+ export * from "./Logger";
2
+ export * from "./type";
@@ -0,0 +1,14 @@
1
+ export interface ILogger {
2
+ setEnabledLevels(levels: LogLevel[]): void;
3
+ getEnabledLevels(): LogLevel[];
4
+ setEnabled(enabled: boolean): void;
5
+ isLoggingEnabled(): boolean;
6
+ log(...data: any[]): void;
7
+ info(...data: any[]): void;
8
+ debug(...data: any[]): void;
9
+ warn(...data: any[]): void;
10
+ error(...data: any[]): void;
11
+ trace(...data: any[]): void;
12
+ }
13
+
14
+ export type LogLevel = "debug" | "info" | "warn" | "error" | "trace";
@@ -1,19 +1,20 @@
1
1
  import isNetworkError from "is-network-error";
2
- import { RequestEvent, RequestEventPayload } from "../types";
2
+ import { IFormoEvent, IFormoEventPayload } from "../../types";
3
3
  import {
4
4
  clampNumber,
5
5
  getActionDescriptor,
6
6
  hash,
7
7
  millisecondsToSecond,
8
8
  toDateHourMinute,
9
- } from "../utils";
10
- import { logger } from "./logger";
11
- import { EVENTS_API_REQUEST_HEADER } from "../constants";
12
- import fetch from "./fetch";
9
+ } from "../../utils";
10
+ import { logger } from "../logger";
11
+ import { EVENTS_API_REQUEST_HEADER } from "../../constants";
12
+ import fetch from "../fetch";
13
+ import { IEventQueue } from "./type";
13
14
  const noop = () => {};
14
15
 
15
16
  type QueueItem = {
16
- message: RequestEventPayload;
17
+ message: IFormoEventPayload;
17
18
  callback: (...args: any) => any;
18
19
  };
19
20
 
@@ -43,7 +44,7 @@ const DEFAULT_FLUSH_INTERVAL = 1_000 * 30; // 1 MINUTE
43
44
  const MAX_FLUSH_INTERVAL = 1_000 * 300; // 5 MINUTES
44
45
  const MIN_FLUSH_INTERVAL = 1_000 * 10; // 10 SECONDS
45
46
 
46
- export class EventQueue {
47
+ export class EventQueue implements IEventQueue {
47
48
  private writeKey: string;
48
49
  private url: string;
49
50
  private queue: QueueItem[] = [];
@@ -96,7 +97,7 @@ export class EventQueue {
96
97
  }
97
98
 
98
99
  //#region Public functions
99
- async enqueue(event: RequestEvent, callback?: (...args: any) => void) {
100
+ async enqueue(event: IFormoEvent, callback?: (...args: any) => void) {
100
101
  callback = callback || noop;
101
102
 
102
103
  const formattedTimestamp = toDateHourMinute(new Date(event.timestamp));
@@ -115,7 +116,10 @@ export class EventQueue {
115
116
  return;
116
117
  }
117
118
 
118
- this.queue.push({ message: { ...event, timestamp: originTimestamp, id: eventId }, callback });
119
+ this.queue.push({
120
+ message: { ...event, timestamp: originTimestamp, id: eventId },
121
+ callback,
122
+ });
119
123
 
120
124
  logger.log(
121
125
  `Event enqueued: ${getActionDescriptor(event.action, event.payload)}`
@@ -0,0 +1,2 @@
1
+ export * from "./EventQueue";
2
+ export * from "./type";
@@ -0,0 +1,6 @@
1
+ import { IFormoEvent } from "../../types";
2
+
3
+ export interface IEventQueue {
4
+ enqueue(event: IFormoEvent, callback?: (...args: any) => void): Promise<void>;
5
+ flush(callback?: (...args: any) => void): Promise<any>;
6
+ }
package/src/types/base.ts CHANGED
@@ -7,6 +7,8 @@ export type ChainID = number;
7
7
  // Address (EVM, Solana, etc.)
8
8
  export type Address = string;
9
9
 
10
+ export type ValidInputTypes = Uint8Array | bigint | string | number | boolean;
11
+
10
12
  export interface Options {
11
13
  provider?: EIP1193Provider;
12
14
  trackLocalhost?: boolean;
@@ -1,6 +1,7 @@
1
1
  import { UUID } from "crypto";
2
+ import { Address, ChainID } from "./base";
2
3
 
3
- export interface RequestEvent {
4
+ export interface IFormoEvent {
4
5
  anonymous_id: UUID;
5
6
  user_id: string | null;
6
7
  action: string;
@@ -10,10 +11,60 @@ export interface RequestEvent {
10
11
  version: string;
11
12
  }
12
13
 
13
- export type RequestEventPayload = RequestEvent & {
14
+ export type IFormoEventPayload = IFormoEvent & {
14
15
  id: string;
15
16
  };
16
17
 
18
+ export type APIEvent =
19
+ | {
20
+ action: "page_hit";
21
+ }
22
+ | {
23
+ action: "detect_wallet";
24
+ providerName: string;
25
+ rdns: string;
26
+ }
27
+ | {
28
+ action: "identify";
29
+ address: string;
30
+ providerName: string;
31
+ rdns: string;
32
+ userId?: string;
33
+ }
34
+ | {
35
+ action: "chain_changed";
36
+ chainId: ChainID;
37
+ address: Address;
38
+ }
39
+ | {
40
+ action: "transaction";
41
+ status: TransactionStatus;
42
+ chainId: ChainID;
43
+ address: Address;
44
+ data: string;
45
+ to: string;
46
+ value: string;
47
+ transactionHash: string;
48
+ }
49
+ | {
50
+ action: "signature";
51
+ status: SignatureStatus;
52
+ chainId: ChainID;
53
+ address: Address;
54
+ message: string;
55
+ signatureHash: string;
56
+ }
57
+ | {
58
+ action: "disconnect";
59
+ chainId: ChainID;
60
+ address: Address;
61
+ }
62
+ | {
63
+ action: "connect";
64
+ chainId: ChainID;
65
+ address: Address;
66
+ };
67
+
17
68
  export enum SignatureStatus {
18
69
  REQUESTED = "requested",
19
70
  REJECTED = "rejected",
@@ -0,0 +1,43 @@
1
+ import { Address } from "../types";
2
+ import { keccak256 } from "ethereum-cryptography/keccak.js";
3
+ import { utf8ToBytes } from "ethereum-cryptography/utils.js";
4
+ import {
5
+ ensureIfUint8Array,
6
+ isAddress,
7
+ uint8ArrayToHexString,
8
+ } from "../validators";
9
+ import { isNullish } from "../validators/object";
10
+
11
+ export const toChecksumAddress = (address: Address): string => {
12
+ if (!isAddress(address, false)) {
13
+ throw new Error("Invalid address " + address);
14
+ }
15
+
16
+ const lowerCaseAddress = address.toLowerCase().replace(/^0x/i, "");
17
+
18
+ const hash = uint8ArrayToHexString(
19
+ keccak256(ensureIfUint8Array(utf8ToBytes(lowerCaseAddress)))
20
+ );
21
+
22
+ if (
23
+ isNullish(hash) ||
24
+ hash ===
25
+ "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
26
+ )
27
+ return ""; // // EIP-1052 if hash is equal to c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470, keccak was given empty data
28
+
29
+ let checksumAddress = "0x";
30
+
31
+ const addressHash = hash.replace(/^0x/i, "");
32
+
33
+ for (let i = 0; i < lowerCaseAddress.length; i += 1) {
34
+ // If ith character is 8 to f then make it uppercase
35
+ if (parseInt(addressHash[i], 16) > 7) {
36
+ checksumAddress += lowerCaseAddress[i].toUpperCase();
37
+ } else {
38
+ checksumAddress += lowerCaseAddress[i];
39
+ }
40
+ }
41
+
42
+ return checksumAddress;
43
+ };
package/src/utils/base.ts CHANGED
@@ -1,65 +1,3 @@
1
- import { UUID } from "crypto";
2
-
3
- const toSnake = (str: string) =>
4
- str
5
- .replace(/([a-z])([A-Z])/g, "$1_$2")
6
- .replace(/[\s-]+/g, "_")
7
- .toLowerCase();
8
-
9
- // Converts object keys to snake_case, omitting keys in the omitKeys array
10
- export function toSnakeCase(obj: any, omitKeys: string[] = []) {
11
- const convert = (data: any): any => {
12
- if (Array.isArray(data)) {
13
- return data.map(convert); // Recursively handle array elements
14
- } else if (data !== null && typeof data === "object") {
15
- return Object.keys(data).reduce((acc: any, key) => {
16
- // If the key is in omitKeys, keep it as it is
17
- const resultKey = omitKeys.includes(key) ? key : toSnake(key);
18
- acc[resultKey] = omitKeys.includes(key)
19
- ? data[key]
20
- : convert(data[key]);
21
- return acc;
22
- }, {});
23
- }
24
- return data;
25
- };
26
-
27
- return convert(obj);
28
- }
29
-
30
- export const millisecondsToSecond = (milliseconds: number): number =>
31
- Math.ceil(milliseconds / 1_000);
32
-
33
- export const toDateHourMinute = (date: Date) =>
34
- date.getUTCFullYear() +
35
- "-" +
36
- ("0" + (date.getUTCMonth() + 1)).slice(-2) +
37
- "-" +
38
- ("0" + date.getUTCDate()).slice(-2) +
39
- " " +
40
- ("0" + date.getUTCHours()).slice(-2) +
41
- ":" +
42
- ("0" + date.getUTCMinutes()).slice(-2);
43
-
44
- export const clampNumber = (value: number, max: number, min: number) => {
45
- return Math.min(Math.max(value, min), max);
46
- };
47
-
48
1
  export const getActionDescriptor = (action: string, payload: any): string => {
49
2
  return `${action}${payload?.status ? ` ${payload?.status}` : ""}`;
50
3
  };
51
-
52
- export async function hash(input: string): Promise<string> {
53
- const hashBuffer = await crypto.subtle.digest(
54
- "SHA-256",
55
- new TextEncoder().encode(input)
56
- );
57
- const byteArray = new Uint8Array(hashBuffer);
58
- return Array.from(byteArray)
59
- .map((byte) => byte.toString(16).padStart(2, "0"))
60
- .join("");
61
- }
62
-
63
- export function generateNativeUUID(): UUID {
64
- return crypto.randomUUID();
65
- }
@@ -0,0 +1,44 @@
1
+ const toSnake = (str: string) =>
2
+ str
3
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
4
+ .replace(/[\s-]+/g, "_")
5
+ .toLowerCase();
6
+
7
+ // Converts object keys to snake_case, omitting keys in the omitKeys array
8
+ export function toSnakeCase(obj: any, omitKeys: string[] = []) {
9
+ const convert = (data: any): any => {
10
+ if (Array.isArray(data)) {
11
+ return data.map(convert); // Recursively handle array elements
12
+ } else if (data !== null && typeof data === "object") {
13
+ return Object.keys(data).reduce((acc: any, key) => {
14
+ // If the key is in omitKeys, keep it as it is
15
+ const resultKey = omitKeys.includes(key) ? key : toSnake(key);
16
+ acc[resultKey] = omitKeys.includes(key)
17
+ ? data[key]
18
+ : convert(data[key]);
19
+ return acc;
20
+ }, {});
21
+ }
22
+ return data;
23
+ };
24
+
25
+ return convert(obj);
26
+ }
27
+
28
+ export const millisecondsToSecond = (milliseconds: number): number =>
29
+ Math.ceil(milliseconds / 1_000);
30
+
31
+ export const toDateHourMinute = (date: Date) =>
32
+ date.getUTCFullYear() +
33
+ "-" +
34
+ ("0" + (date.getUTCMonth() + 1)).slice(-2) +
35
+ "-" +
36
+ ("0" + date.getUTCDate()).slice(-2) +
37
+ " " +
38
+ ("0" + date.getUTCHours()).slice(-2) +
39
+ ":" +
40
+ ("0" + date.getUTCMinutes()).slice(-2);
41
+
42
+ export const clampNumber = (value: number, max: number, min: number) => {
43
+ return Math.min(Math.max(value, min), max);
44
+ };
@@ -0,0 +1,16 @@
1
+ import type { UUID } from "crypto";
2
+
3
+ export async function hash(input: string): Promise<string> {
4
+ const hashBuffer = await crypto.subtle.digest(
5
+ "SHA-256",
6
+ new TextEncoder().encode(input)
7
+ );
8
+ const byteArray = new Uint8Array(hashBuffer);
9
+ return Array.from(byteArray)
10
+ .map((byte) => byte.toString(16).padStart(2, "0"))
11
+ .join("");
12
+ }
13
+
14
+ export function generateNativeUUID(): UUID {
15
+ return crypto.randomUUID();
16
+ }
@@ -1,2 +1,4 @@
1
+ export * from "./address";
1
2
  export * from "./base";
2
- export * from "./is";
3
+ export * from "./converter";
4
+ export * from "./generate";