flowgrid-sdk 1.2.1 → 1.3.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 (312) hide show
  1. package/README.md +224 -250
  2. package/dist/237.flowgrid.min.js +2 -0
  3. package/dist/237.flowgrid.min.js.map +1 -0
  4. package/dist/546.flowgrid.min.js +3 -0
  5. package/dist/546.flowgrid.min.js.LICENSE.txt +14 -0
  6. package/dist/546.flowgrid.min.js.map +1 -0
  7. package/dist/EXAMPLE.d.ts +1 -0
  8. package/dist/EXAMPLE.js +55 -0
  9. package/dist/EXAMPLE.js.map +1 -0
  10. package/dist/browser.d.ts +46 -103
  11. package/dist/browser.js +102 -0
  12. package/dist/browser.js.map +1 -0
  13. package/dist/flowgrid.min.js +1 -1
  14. package/dist/flowgrid.min.js.map +1 -1
  15. package/dist/index.d.ts +7 -8
  16. package/dist/index.js +64 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/client/transport.d.ts +14 -4
  19. package/dist/lib/client/transport.js +432 -0
  20. package/dist/lib/client/transport.js.map +1 -0
  21. package/dist/lib/consent/index.d.ts +0 -5
  22. package/dist/lib/consent/index.js +32 -0
  23. package/dist/lib/consent/index.js.map +1 -0
  24. package/dist/lib/consent/manager.js +336 -0
  25. package/dist/lib/consent/manager.js.map +1 -0
  26. package/dist/lib/consent/types.d.ts +3 -20
  27. package/dist/lib/consent/types.js +10 -0
  28. package/dist/lib/consent/types.js.map +1 -0
  29. package/dist/lib/features/analytics/attribution.d.ts +6 -47
  30. package/dist/lib/features/analytics/attribution.js +181 -0
  31. package/dist/lib/features/analytics/attribution.js.map +1 -0
  32. package/dist/lib/features/analytics/events.d.ts +1 -28
  33. package/dist/lib/features/analytics/events.js +256 -0
  34. package/dist/lib/features/analytics/events.js.map +1 -0
  35. package/dist/lib/features/analytics/funnels.js +260 -0
  36. package/dist/lib/features/analytics/funnels.js.map +1 -0
  37. package/dist/lib/features/analytics/heatmaps.d.ts +12 -19
  38. package/dist/lib/features/analytics/heatmaps.js +258 -0
  39. package/dist/lib/features/analytics/heatmaps.js.map +1 -0
  40. package/dist/lib/features/analytics/identify.d.ts +1 -21
  41. package/dist/lib/features/analytics/identify.js +213 -0
  42. package/dist/lib/features/analytics/identify.js.map +1 -0
  43. package/dist/lib/features/analytics/index.d.ts +2 -0
  44. package/dist/lib/features/analytics/index.js +15 -0
  45. package/dist/lib/features/analytics/index.js.map +1 -0
  46. package/dist/lib/features/analytics/page-views.d.ts +13 -30
  47. package/dist/lib/features/analytics/page-views.js +268 -0
  48. package/dist/lib/features/analytics/page-views.js.map +1 -0
  49. package/dist/lib/features/analytics/performance.d.ts +18 -24
  50. package/dist/lib/features/analytics/performance.js +232 -0
  51. package/dist/lib/features/analytics/performance.js.map +1 -0
  52. package/dist/lib/features/analytics/replay.d.ts +170 -0
  53. package/dist/lib/features/analytics/replay.js +381 -0
  54. package/dist/lib/features/analytics/replay.js.map +1 -0
  55. package/dist/lib/features/analytics/retention.d.ts +1 -76
  56. package/dist/lib/features/analytics/retention.js +135 -0
  57. package/dist/lib/features/analytics/retention.js.map +1 -0
  58. package/dist/lib/features/analytics/sessions.d.ts +12 -37
  59. package/dist/lib/features/analytics/sessions.js +213 -0
  60. package/dist/lib/features/analytics/sessions.js.map +1 -0
  61. package/dist/lib/features/core/activation.d.ts +1 -24
  62. package/dist/lib/features/core/activation.js +175 -0
  63. package/dist/lib/features/core/activation.js.map +1 -0
  64. package/dist/lib/features/core/experiment.d.ts +53 -21
  65. package/dist/lib/features/core/experiment.js +554 -0
  66. package/dist/lib/features/core/experiment.js.map +1 -0
  67. package/dist/lib/features/core/index.js +9 -0
  68. package/dist/lib/features/core/index.js.map +1 -0
  69. package/dist/lib/features/core/track-feature.d.ts +1 -8
  70. package/dist/lib/features/core/track-feature.js +119 -0
  71. package/dist/lib/features/core/track-feature.js.map +1 -0
  72. package/dist/lib/features/core/track-prompt.d.ts +5 -8
  73. package/dist/lib/features/core/track-prompt.js +181 -0
  74. package/dist/lib/features/core/track-prompt.js.map +1 -0
  75. package/dist/lib/features/ecommerce/cart.d.ts +1 -24
  76. package/dist/lib/features/ecommerce/cart.js +244 -0
  77. package/dist/lib/features/ecommerce/cart.js.map +1 -0
  78. package/dist/lib/features/ecommerce/checkout.d.ts +1 -28
  79. package/dist/lib/features/ecommerce/checkout.js +254 -0
  80. package/dist/lib/features/ecommerce/checkout.js.map +1 -0
  81. package/dist/lib/features/ecommerce/index.d.ts +0 -2
  82. package/dist/lib/features/ecommerce/index.js +15 -0
  83. package/dist/lib/features/ecommerce/index.js.map +1 -0
  84. package/dist/lib/features/ecommerce/ltv.d.ts +1 -69
  85. package/dist/lib/features/ecommerce/ltv.js +114 -0
  86. package/dist/lib/features/ecommerce/ltv.js.map +1 -0
  87. package/dist/lib/features/ecommerce/products.d.ts +1 -33
  88. package/dist/lib/features/ecommerce/products.js +223 -0
  89. package/dist/lib/features/ecommerce/products.js.map +1 -0
  90. package/dist/lib/features/ecommerce/promotions.d.ts +1 -30
  91. package/dist/lib/features/ecommerce/promotions.js +197 -0
  92. package/dist/lib/features/ecommerce/promotions.js.map +1 -0
  93. package/dist/lib/features/ecommerce/purchases.d.ts +1 -48
  94. package/dist/lib/features/ecommerce/purchases.js +193 -0
  95. package/dist/lib/features/ecommerce/purchases.js.map +1 -0
  96. package/dist/lib/features/ecommerce/refunds.d.ts +1 -27
  97. package/dist/lib/features/ecommerce/refunds.js +195 -0
  98. package/dist/lib/features/ecommerce/refunds.js.map +1 -0
  99. package/dist/lib/features/ecommerce/search.d.ts +1 -24
  100. package/dist/lib/features/ecommerce/search.js +156 -0
  101. package/dist/lib/features/ecommerce/search.js.map +1 -0
  102. package/dist/lib/features/ecommerce/subscriptions.d.ts +1 -28
  103. package/dist/lib/features/ecommerce/subscriptions.js +207 -0
  104. package/dist/lib/features/ecommerce/subscriptions.js.map +1 -0
  105. package/dist/lib/features/ecommerce/wishlist.d.ts +1 -28
  106. package/dist/lib/features/ecommerce/wishlist.js +186 -0
  107. package/dist/lib/features/ecommerce/wishlist.js.map +1 -0
  108. package/dist/lib/features/enterprise/acquisition.d.ts +2 -57
  109. package/dist/lib/features/enterprise/acquisition.js +166 -0
  110. package/dist/lib/features/enterprise/acquisition.js.map +1 -0
  111. package/dist/lib/features/enterprise/alerts.d.ts +1 -37
  112. package/dist/lib/features/enterprise/alerts.js +246 -0
  113. package/dist/lib/features/enterprise/alerts.js.map +1 -0
  114. package/dist/lib/features/enterprise/churn.d.ts +1 -42
  115. package/dist/lib/features/enterprise/churn.js +175 -0
  116. package/dist/lib/features/enterprise/churn.js.map +1 -0
  117. package/dist/lib/features/enterprise/cohorts.d.ts +1 -37
  118. package/dist/lib/features/enterprise/cohorts.js +201 -0
  119. package/dist/lib/features/enterprise/cohorts.js.map +1 -0
  120. package/dist/lib/features/enterprise/engagement.d.ts +40 -46
  121. package/dist/lib/features/enterprise/engagement.js +335 -0
  122. package/dist/lib/features/enterprise/engagement.js.map +1 -0
  123. package/dist/lib/features/enterprise/forecasting.d.ts +0 -50
  124. package/dist/lib/features/enterprise/forecasting.js +232 -0
  125. package/dist/lib/features/enterprise/forecasting.js.map +1 -0
  126. package/dist/lib/features/enterprise/index.d.ts +1 -1
  127. package/dist/lib/features/enterprise/index.js +76 -0
  128. package/dist/lib/features/enterprise/index.js.map +1 -0
  129. package/dist/lib/features/enterprise/monetization.d.ts +1 -60
  130. package/dist/lib/features/enterprise/monetization.js +146 -0
  131. package/dist/lib/features/enterprise/monetization.js.map +1 -0
  132. package/dist/lib/features/enterprise/multi-path-funnels.d.ts +1 -17
  133. package/dist/lib/features/enterprise/multi-path-funnels.js +205 -0
  134. package/dist/lib/features/enterprise/multi-path-funnels.js.map +1 -0
  135. package/dist/lib/features/enterprise/paths.d.ts +1 -56
  136. package/dist/lib/features/enterprise/paths.js +149 -0
  137. package/dist/lib/features/enterprise/paths.js.map +1 -0
  138. package/dist/lib/features/enterprise/security.d.ts +8 -57
  139. package/dist/lib/features/enterprise/security.js +202 -0
  140. package/dist/lib/features/enterprise/security.js.map +1 -0
  141. package/dist/lib/features/enterprise/support.d.ts +3 -42
  142. package/dist/lib/features/enterprise/support.js +162 -0
  143. package/dist/lib/features/enterprise/support.js.map +1 -0
  144. package/dist/lib/flowgrid.d.ts +278 -0
  145. package/dist/lib/flowgrid.js +323 -0
  146. package/dist/lib/flowgrid.js.map +1 -0
  147. package/dist/lib/frameworks/index.d.ts +13 -6
  148. package/dist/lib/frameworks/index.js +18 -0
  149. package/dist/lib/frameworks/index.js.map +1 -0
  150. package/dist/lib/frameworks/nextjs/client.js +355 -0
  151. package/dist/lib/frameworks/nextjs/client.js.map +1 -0
  152. package/dist/lib/frameworks/nextjs/index.js +31 -0
  153. package/dist/lib/frameworks/nextjs/index.js.map +1 -0
  154. package/dist/lib/frameworks/nextjs/server.js +259 -0
  155. package/dist/lib/frameworks/nextjs/server.js.map +1 -0
  156. package/dist/lib/frameworks/node/index.js +391 -0
  157. package/dist/lib/frameworks/node/index.js.map +1 -0
  158. package/dist/lib/frameworks/nuxt/index.js +288 -0
  159. package/dist/lib/frameworks/nuxt/index.js.map +1 -0
  160. package/dist/lib/frameworks/react/CookieBanner.js +166 -0
  161. package/dist/lib/frameworks/react/CookieBanner.js.map +1 -0
  162. package/dist/lib/frameworks/react/index.js +271 -0
  163. package/dist/lib/frameworks/react/index.js.map +1 -0
  164. package/dist/lib/frameworks/vue/CookieBanner.js +165 -0
  165. package/dist/lib/frameworks/vue/CookieBanner.js.map +1 -0
  166. package/dist/lib/frameworks/vue/index.js +390 -0
  167. package/dist/lib/frameworks/vue/index.js.map +1 -0
  168. package/dist/lib/tracking/analytics/attribution.d.ts +14 -0
  169. package/dist/lib/tracking/analytics/attribution.js +18 -0
  170. package/dist/lib/tracking/analytics/attribution.js.map +1 -0
  171. package/dist/lib/tracking/analytics/events.d.ts +26 -0
  172. package/dist/lib/tracking/analytics/events.js +30 -0
  173. package/dist/lib/tracking/analytics/events.js.map +1 -0
  174. package/dist/lib/tracking/analytics/funnels.d.ts +16 -0
  175. package/dist/lib/tracking/analytics/funnels.js +22 -0
  176. package/dist/lib/tracking/analytics/funnels.js.map +1 -0
  177. package/dist/lib/tracking/analytics/heatmaps.d.ts +27 -0
  178. package/dist/lib/tracking/analytics/heatmaps.js +22 -0
  179. package/dist/lib/tracking/analytics/heatmaps.js.map +1 -0
  180. package/dist/lib/tracking/analytics/identify.d.ts +16 -0
  181. package/dist/lib/tracking/analytics/identify.js +22 -0
  182. package/dist/lib/tracking/analytics/identify.js.map +1 -0
  183. package/dist/lib/tracking/analytics/index.d.ts +10 -0
  184. package/dist/lib/tracking/analytics/index.js +11 -0
  185. package/dist/lib/tracking/analytics/index.js.map +1 -0
  186. package/dist/lib/tracking/analytics/page-views.d.ts +29 -0
  187. package/dist/lib/tracking/analytics/page-views.js +50 -0
  188. package/dist/lib/tracking/analytics/page-views.js.map +1 -0
  189. package/dist/lib/tracking/analytics/performance.d.ts +22 -0
  190. package/dist/lib/tracking/analytics/performance.js +22 -0
  191. package/dist/lib/tracking/analytics/performance.js.map +1 -0
  192. package/dist/lib/tracking/analytics/replay.d.ts +34 -0
  193. package/dist/lib/tracking/analytics/replay.js +46 -0
  194. package/dist/lib/tracking/analytics/replay.js.map +1 -0
  195. package/dist/lib/tracking/analytics/retention.d.ts +10 -0
  196. package/dist/lib/tracking/analytics/retention.js +10 -0
  197. package/dist/lib/tracking/analytics/retention.js.map +1 -0
  198. package/dist/lib/tracking/analytics/sessions.d.ts +20 -0
  199. package/dist/lib/tracking/analytics/sessions.js +26 -0
  200. package/dist/lib/tracking/analytics/sessions.js.map +1 -0
  201. package/dist/lib/tracking/core/activation.d.ts +23 -0
  202. package/dist/lib/tracking/core/activation.js +33 -0
  203. package/dist/lib/tracking/core/activation.js.map +1 -0
  204. package/dist/lib/tracking/core/experiment.d.ts +122 -0
  205. package/dist/lib/tracking/core/experiment.js +150 -0
  206. package/dist/lib/tracking/core/experiment.js.map +1 -0
  207. package/dist/lib/tracking/core/feature.d.ts +13 -0
  208. package/dist/lib/tracking/core/feature.js +14 -0
  209. package/dist/lib/tracking/core/feature.js.map +1 -0
  210. package/dist/lib/tracking/core/index.d.ts +4 -0
  211. package/dist/lib/tracking/core/index.js +5 -0
  212. package/dist/lib/tracking/core/index.js.map +1 -0
  213. package/dist/lib/tracking/core/prompt.d.ts +18 -0
  214. package/dist/lib/tracking/core/prompt.js +26 -0
  215. package/dist/lib/tracking/core/prompt.js.map +1 -0
  216. package/dist/lib/tracking/ecommerce/cart.d.ts +17 -0
  217. package/dist/lib/tracking/ecommerce/cart.js +22 -0
  218. package/dist/lib/tracking/ecommerce/cart.js.map +1 -0
  219. package/dist/lib/tracking/ecommerce/checkout.d.ts +17 -0
  220. package/dist/lib/tracking/ecommerce/checkout.js +22 -0
  221. package/dist/lib/tracking/ecommerce/checkout.js.map +1 -0
  222. package/dist/lib/tracking/ecommerce/index.d.ts +10 -0
  223. package/dist/lib/tracking/ecommerce/index.js +11 -0
  224. package/dist/lib/tracking/ecommerce/index.js.map +1 -0
  225. package/dist/lib/tracking/ecommerce/ltv.d.ts +15 -0
  226. package/dist/lib/tracking/ecommerce/ltv.js +14 -0
  227. package/dist/lib/tracking/ecommerce/ltv.js.map +1 -0
  228. package/dist/lib/tracking/ecommerce/products.d.ts +15 -0
  229. package/dist/lib/tracking/ecommerce/products.js +18 -0
  230. package/dist/lib/tracking/ecommerce/products.js.map +1 -0
  231. package/dist/lib/tracking/ecommerce/promotions.d.ts +14 -0
  232. package/dist/lib/tracking/ecommerce/promotions.js +25 -0
  233. package/dist/lib/tracking/ecommerce/promotions.js.map +1 -0
  234. package/dist/lib/tracking/ecommerce/purchases.d.ts +11 -0
  235. package/dist/lib/tracking/ecommerce/purchases.js +10 -0
  236. package/dist/lib/tracking/ecommerce/purchases.js.map +1 -0
  237. package/dist/lib/tracking/ecommerce/refunds.d.ts +17 -0
  238. package/dist/lib/tracking/ecommerce/refunds.js +22 -0
  239. package/dist/lib/tracking/ecommerce/refunds.js.map +1 -0
  240. package/dist/lib/tracking/ecommerce/search.d.ts +24 -0
  241. package/dist/lib/tracking/ecommerce/search.js +22 -0
  242. package/dist/lib/tracking/ecommerce/search.js.map +1 -0
  243. package/dist/lib/tracking/ecommerce/subscriptions.d.ts +21 -0
  244. package/dist/lib/tracking/ecommerce/subscriptions.js +38 -0
  245. package/dist/lib/tracking/ecommerce/subscriptions.js.map +1 -0
  246. package/dist/lib/tracking/ecommerce/wishlist.d.ts +19 -0
  247. package/dist/lib/tracking/ecommerce/wishlist.js +26 -0
  248. package/dist/lib/tracking/ecommerce/wishlist.js.map +1 -0
  249. package/dist/lib/tracking/enterprise/acquisition.d.ts +25 -0
  250. package/dist/lib/tracking/enterprise/acquisition.js +22 -0
  251. package/dist/lib/tracking/enterprise/acquisition.js.map +1 -0
  252. package/dist/lib/tracking/enterprise/alerts.d.ts +32 -0
  253. package/dist/lib/tracking/enterprise/alerts.js +30 -0
  254. package/dist/lib/tracking/enterprise/alerts.js.map +1 -0
  255. package/dist/lib/tracking/enterprise/churn.d.ts +23 -0
  256. package/dist/lib/tracking/enterprise/churn.js +22 -0
  257. package/dist/lib/tracking/enterprise/churn.js.map +1 -0
  258. package/dist/lib/tracking/enterprise/cohorts.d.ts +18 -0
  259. package/dist/lib/tracking/enterprise/cohorts.js +18 -0
  260. package/dist/lib/tracking/enterprise/cohorts.js.map +1 -0
  261. package/dist/lib/tracking/enterprise/engagement.d.ts +31 -0
  262. package/dist/lib/tracking/enterprise/engagement.js +44 -0
  263. package/dist/lib/tracking/enterprise/engagement.js.map +1 -0
  264. package/dist/lib/tracking/enterprise/forecasting.d.ts +18 -0
  265. package/dist/lib/tracking/enterprise/forecasting.js +22 -0
  266. package/dist/lib/tracking/enterprise/forecasting.js.map +1 -0
  267. package/dist/lib/tracking/enterprise/index.d.ts +11 -0
  268. package/dist/lib/tracking/enterprise/index.js +12 -0
  269. package/dist/lib/tracking/enterprise/index.js.map +1 -0
  270. package/dist/lib/tracking/enterprise/monetization.d.ts +14 -0
  271. package/dist/lib/tracking/enterprise/monetization.js +10 -0
  272. package/dist/lib/tracking/enterprise/monetization.js.map +1 -0
  273. package/dist/lib/tracking/enterprise/multi-path-funnels.d.ts +20 -0
  274. package/dist/lib/tracking/enterprise/multi-path-funnels.js +18 -0
  275. package/dist/lib/tracking/enterprise/multi-path-funnels.js.map +1 -0
  276. package/dist/lib/tracking/enterprise/paths.d.ts +20 -0
  277. package/dist/lib/tracking/enterprise/paths.js +18 -0
  278. package/dist/lib/tracking/enterprise/paths.js.map +1 -0
  279. package/dist/lib/tracking/enterprise/security.d.ts +28 -0
  280. package/dist/lib/tracking/enterprise/security.js +26 -0
  281. package/dist/lib/tracking/enterprise/security.js.map +1 -0
  282. package/dist/lib/tracking/enterprise/support.d.ts +25 -0
  283. package/dist/lib/tracking/enterprise/support.js +22 -0
  284. package/dist/lib/tracking/enterprise/support.js.map +1 -0
  285. package/dist/lib/tracking/index.d.ts +4 -0
  286. package/dist/lib/tracking/index.js +5 -0
  287. package/dist/lib/tracking/index.js.map +1 -0
  288. package/dist/lib/types/analytics.d.ts +10 -2
  289. package/dist/lib/types/analytics.js +6 -0
  290. package/dist/lib/types/analytics.js.map +1 -0
  291. package/dist/lib/types/common.js +6 -0
  292. package/dist/lib/types/common.js.map +1 -0
  293. package/dist/lib/types/ecommerce.js +6 -0
  294. package/dist/lib/types/ecommerce.js.map +1 -0
  295. package/dist/lib/types/index.js +8 -0
  296. package/dist/lib/types/index.js.map +1 -0
  297. package/dist/lib/utils/browser.d.ts +16 -0
  298. package/dist/lib/utils/browser.js +32 -0
  299. package/dist/lib/utils/browser.js.map +1 -0
  300. package/dist/lib/utils/identity.js +346 -0
  301. package/dist/lib/utils/identity.js.map +1 -0
  302. package/dist/lib/utils/storage.js +105 -0
  303. package/dist/lib/utils/storage.js.map +1 -0
  304. package/dist/umd/237.index.js +2 -0
  305. package/dist/umd/237.index.js.map +1 -0
  306. package/dist/umd/546.index.js +3 -0
  307. package/dist/umd/546.index.js.LICENSE.txt +14 -0
  308. package/dist/umd/546.index.js.map +1 -0
  309. package/dist/umd/index.js +2 -0
  310. package/dist/umd/index.js.map +1 -0
  311. package/package.json +27 -80
  312. package/dist/lib/features/ecommerce/inventory.d.ts +0 -219
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Security shortcuts.
3
+ */
4
+ import { SecurityAnalytics, DataAccessConfig, ComplianceEventConfig } from "../../features/enterprise/security";
5
+ export declare class SecurityTracker {
6
+ readonly client: SecurityAnalytics;
7
+ constructor(client: SecurityAnalytics);
8
+ /** Login attempt (success or failure). */
9
+ login(userId: string, success: boolean, properties?: Record<string, unknown>): Promise<{
10
+ tracked: boolean;
11
+ }>;
12
+ /** A user role changed. */
13
+ roleChange(userId: string, changedBy: string, previousRole: string, newRole: string): Promise<{
14
+ tracked: boolean;
15
+ }>;
16
+ /** A permission was granted or revoked. */
17
+ permissionChange(userId: string, changedBy: string, permission: string, action: "granted" | "revoked"): Promise<{
18
+ tracked: boolean;
19
+ }>;
20
+ /** A user accessed sensitive data. */
21
+ dataAccess(userId: string, resourceType: string, accessType: DataAccessConfig["accessType"], properties?: Record<string, unknown>): Promise<{
22
+ tracked: boolean;
23
+ }>;
24
+ /** A compliance-relevant event occurred (GDPR/SOC2 etc.). */
25
+ compliance(userId: string, eventType: ComplianceEventConfig["eventType"], properties?: Record<string, unknown>): Promise<{
26
+ tracked: boolean;
27
+ }>;
28
+ }
@@ -0,0 +1,26 @@
1
+ export class SecurityTracker {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ /** Login attempt (success or failure). */
6
+ login(userId, success, properties) {
7
+ return this.client.trackLoginAttempt({ userId, success, properties });
8
+ }
9
+ /** A user role changed. */
10
+ roleChange(userId, changedBy, previousRole, newRole) {
11
+ return this.client.trackRoleChange({ userId, changedBy, previousRole, newRole });
12
+ }
13
+ /** A permission was granted or revoked. */
14
+ permissionChange(userId, changedBy, permission, action) {
15
+ return this.client.trackPermissionChange({ userId, changedBy, permission, action });
16
+ }
17
+ /** A user accessed sensitive data. */
18
+ dataAccess(userId, resourceType, accessType, properties) {
19
+ return this.client.trackDataAccess({ userId, resourceType, accessType, properties });
20
+ }
21
+ /** A compliance-relevant event occurred (GDPR/SOC2 etc.). */
22
+ compliance(userId, eventType, properties) {
23
+ return this.client.trackComplianceEvent({ userId, eventType, properties });
24
+ }
25
+ }
26
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../../src/lib/tracking/enterprise/security.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,eAAe;IAC1B,YAA4B,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAEzD,0CAA0C;IAC1C,KAAK,CAAC,MAAc,EAAE,OAAgB,EAAE,UAAoC;QAC1E,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,2BAA2B;IAC3B,UAAU,CAAC,MAAc,EAAE,SAAiB,EAAE,YAAoB,EAAE,OAAe;QACjF,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,2CAA2C;IAC3C,gBAAgB,CAAC,MAAc,EAAE,SAAiB,EAAE,UAAkB,EAAE,MAA6B;QACnG,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,sCAAsC;IACtC,UAAU,CAAC,MAAc,EAAE,YAAoB,EAAE,UAA0C,EAAE,UAAoC;QAC/H,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,6DAA6D;IAC7D,UAAU,CAAC,MAAc,EAAE,SAA6C,EAAE,UAAoC;QAC5G,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7E,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Support shortcuts.
3
+ */
4
+ import { SupportAnalytics, FeatureComplaintConfig } from "../../features/enterprise/support";
5
+ import type { SupportChannel, TicketStatus } from "../../features/enterprise/support";
6
+ export declare class SupportTracker {
7
+ readonly client: SupportAnalytics;
8
+ constructor(client: SupportAnalytics);
9
+ /** New support ticket created. */
10
+ ticket(ticketId: string, userId: string, subject: string, category: string, priority: "low" | "medium" | "high" | "urgent", channel: SupportChannel): Promise<{
11
+ tracked: boolean;
12
+ }>;
13
+ /** Update an existing ticket. */
14
+ update(ticketId: string, status: TicketStatus, properties?: Record<string, unknown>): Promise<{
15
+ updated: boolean;
16
+ }>;
17
+ /** Customer satisfaction (CSAT) response. */
18
+ csat(ticketId: string, userId: string, score: number, feedback?: string): Promise<{
19
+ tracked: boolean;
20
+ }>;
21
+ /** Complaint about a specific feature. */
22
+ featureComplaint(userId: string, featureId: string, complaintType: FeatureComplaintConfig["complaintType"], severity: FeatureComplaintConfig["severity"]): Promise<{
23
+ tracked: boolean;
24
+ }>;
25
+ }
@@ -0,0 +1,22 @@
1
+ export class SupportTracker {
2
+ constructor(client) {
3
+ this.client = client;
4
+ }
5
+ /** New support ticket created. */
6
+ ticket(ticketId, userId, subject, category, priority, channel) {
7
+ return this.client.trackTicket({ ticketId, userId, subject, category, priority, channel });
8
+ }
9
+ /** Update an existing ticket. */
10
+ update(ticketId, status, properties) {
11
+ return this.client.updateTicket({ ticketId, status, properties });
12
+ }
13
+ /** Customer satisfaction (CSAT) response. */
14
+ csat(ticketId, userId, score, feedback) {
15
+ return this.client.trackCSAT({ ticketId, userId, score, feedback });
16
+ }
17
+ /** Complaint about a specific feature. */
18
+ featureComplaint(userId, featureId, complaintType, severity) {
19
+ return this.client.trackFeatureComplaint({ userId, featureId, complaintType, severity });
20
+ }
21
+ }
22
+ //# sourceMappingURL=support.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/lib/tracking/enterprise/support.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,cAAc;IACzB,YAA4B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAExD,kCAAkC;IAClC,MAAM,CACJ,QAAgB,EAChB,MAAc,EACd,OAAe,EACf,QAAgB,EAChB,QAA8C,EAC9C,OAAuB;QAEvB,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,QAAgB,EAAE,MAAoB,EAAE,UAAoC;QACjF,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAa,EAAE,QAAiB;QACrE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,0CAA0C;IAC1C,gBAAgB,CACd,MAAc,EACd,SAAiB,EACjB,aAAsD,EACtD,QAA4C;QAE5C,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3F,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export * from "./core";
2
+ export * from "./analytics";
3
+ export * from "./ecommerce";
4
+ export * from "./enterprise";
@@ -0,0 +1,5 @@
1
+ export * from "./core";
2
+ export * from "./analytics";
3
+ export * from "./ecommerce";
4
+ export * from "./enterprise";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/tracking/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -95,6 +95,8 @@ export interface ClickEvent {
95
95
  x: number;
96
96
  y: number;
97
97
  };
98
+ /** Custom properties */
99
+ properties?: Record<string, unknown>;
98
100
  }
99
101
  /**
100
102
  * Form submission event.
@@ -106,14 +108,16 @@ export interface FormEvent {
106
108
  formName?: string;
107
109
  /** Form action URL */
108
110
  formAction?: string;
109
- /** Whether submission was successful */
110
- success: boolean;
111
+ /** Whether submission was successful (defaults to true) */
112
+ success?: boolean;
111
113
  /** Field names submitted (without values for privacy) */
112
114
  fields?: string[];
113
115
  /** Validation errors (field names only) */
114
116
  validationErrors?: string[];
115
117
  /** Time to complete form (seconds) */
116
118
  completionTime?: number;
119
+ /** Custom properties */
120
+ properties?: Record<string, unknown>;
117
121
  }
118
122
  /**
119
123
  * Search event.
@@ -131,6 +135,8 @@ export interface SearchEvent {
131
135
  clickedPosition?: number;
132
136
  /** Search filters applied */
133
137
  filters?: Record<string, string | string[]>;
138
+ /** Custom properties */
139
+ properties?: Record<string, unknown>;
134
140
  }
135
141
  /**
136
142
  * Error/exception event.
@@ -148,6 +154,8 @@ export interface ErrorEvent {
148
154
  context?: string;
149
155
  /** User action that triggered error */
150
156
  userAction?: string;
157
+ /** Custom properties */
158
+ properties?: Record<string, unknown>;
151
159
  }
152
160
  /**
153
161
  * Feature usage tracking.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Type definitions for product analytics tracking.
3
+ * @module types/analytics
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/lib/types/analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Common types shared across all FlowGrid SDK modules.
3
+ * @module types/common
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/lib/types/common.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Type definitions for ecommerce tracking.
3
+ * @module types/ecommerce
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=ecommerce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecommerce.js","sourceRoot":"","sources":["../../../src/lib/types/ecommerce.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Central export for all FlowGrid SDK types.
3
+ * @module types
4
+ */
5
+ export * from './common';
6
+ export * from './ecommerce';
7
+ export * from './analytics';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Browser environment helpers.
3
+ *
4
+ * Tiny utilities to check for browser globals safely so feature classes can
5
+ * expose `autoTrack()` methods that no-op gracefully on the server.
6
+ */
7
+ /** Safe `window` accessor; returns `undefined` outside the browser. */
8
+ export declare function getWindow(): (Window & typeof globalThis) | undefined;
9
+ /** Safe `document` accessor; returns `undefined` outside the browser. */
10
+ export declare function getDocument(): Document | undefined;
11
+ /** Returns true when running in a real browser-like environment. */
12
+ export declare function isBrowser(): boolean;
13
+ /** A teardown function returned by every `autoTrack()` API. */
14
+ export type Teardown = () => void;
15
+ /** Compose multiple teardown functions into one. */
16
+ export declare function combineTeardowns(...fns: Array<Teardown | undefined | null | false>): Teardown;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Browser environment helpers.
3
+ *
4
+ * Tiny utilities to check for browser globals safely so feature classes can
5
+ * expose `autoTrack()` methods that no-op gracefully on the server.
6
+ */
7
+ /** Safe `window` accessor; returns `undefined` outside the browser. */
8
+ export function getWindow() {
9
+ return typeof window !== "undefined" ? window : undefined;
10
+ }
11
+ /** Safe `document` accessor; returns `undefined` outside the browser. */
12
+ export function getDocument() {
13
+ return typeof document !== "undefined" ? document : undefined;
14
+ }
15
+ /** Returns true when running in a real browser-like environment. */
16
+ export function isBrowser() {
17
+ return typeof window !== "undefined" && typeof document !== "undefined";
18
+ }
19
+ /** Compose multiple teardown functions into one. */
20
+ export function combineTeardowns(...fns) {
21
+ return () => {
22
+ for (const fn of fns) {
23
+ if (typeof fn === "function") {
24
+ try {
25
+ fn();
26
+ }
27
+ catch { /* swallow */ }
28
+ }
29
+ }
30
+ };
31
+ }
32
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/lib/utils/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uEAAuE;AACvE,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,CAAC;AAC1E,CAAC;AAKD,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,GAAG,GAA+C;IACjF,OAAO,GAAG,EAAE;QACV,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,346 @@
1
+ /**
2
+ * @fileoverview FlowGrid Identity Manager.
3
+ * @module utils/identity
4
+ *
5
+ * @description
6
+ * Owns the visitor/session identity lifecycle.
7
+ * Writes its own cookies/storage so the SDK can self-bootstrap
8
+ * without depending on an external tracking script (track.js).
9
+ *
10
+ * Backward-compatible: checks for existing track.js `visitor_id`
11
+ * before falling back to its own `fg_visitor_id` key.
12
+ */
13
+ import { getCookie, getVisitorId as getTrackJsVisitorId } from './storage';
14
+ // ============================================================================
15
+ // CONSTANTS
16
+ // ============================================================================
17
+ const LEGACY_VISITOR_COOKIE = 'fg_visitor_id';
18
+ const COMPAT_VISITOR_COOKIE = 'visitor_id';
19
+ const SESSION_KEY = 'fg_session_id';
20
+ const SESSION_TOUCH_KEY = 'fg_session_touch';
21
+ // ============================================================================
22
+ // IDENTITY MANAGER
23
+ // ============================================================================
24
+ export class IdentityManager {
25
+ constructor(config) {
26
+ this.visitorId = '';
27
+ this.sessionId = '';
28
+ /** In-memory store for SSR / Node environments */
29
+ this.memoryStore = {};
30
+ this.config = {
31
+ visitorId: config?.visitorId ?? '',
32
+ cookieDomain: config?.cookieDomain ?? '',
33
+ visitorMaxAgeDays: config?.visitorMaxAgeDays ?? 365,
34
+ sessionTimeoutMinutes: config?.sessionTimeoutMinutes ?? 30,
35
+ storage: config?.storage ?? (this.detectBrowser() ? 'cookie' : 'memory'),
36
+ serverCookies: config?.serverCookies,
37
+ compat: config?.compat ?? true,
38
+ };
39
+ this.visitorId = this.resolveVisitorId();
40
+ this.sessionId = '';
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // PUBLIC API
44
+ // ---------------------------------------------------------------------------
45
+ /**
46
+ * Get or create a persistent visitor ID.
47
+ *
48
+ * Resolution order:
49
+ * 1. Explicit config.visitorId
50
+ * 2. track.js `visitor_id` cookie/localStorage (backward compat)
51
+ * 3. `fg_visitor_id` cookie
52
+ * 4. `fg_visitor_id` localStorage
53
+ * 5. Server cookie reader (if provided)
54
+ * 6. Generate new UUID v4, persist to cookie + localStorage
55
+ */
56
+ getVisitorId() {
57
+ if (this.visitorId)
58
+ return this.visitorId;
59
+ this.visitorId = this.resolveVisitorId();
60
+ return this.visitorId;
61
+ }
62
+ /**
63
+ * Get or create a session ID.
64
+ *
65
+ * - Reads from sessionStorage `fg_session_id`
66
+ * - If absent or expired (>sessionTimeoutMinutes since last activity), creates new
67
+ * - Persists to sessionStorage
68
+ * - Touches timestamp on every call
69
+ */
70
+ getSessionId() {
71
+ if (this.config.storage === 'memory') {
72
+ return this.getMemorySessionId();
73
+ }
74
+ if (!this.detectBrowser()) {
75
+ return this.getMemorySessionId();
76
+ }
77
+ try {
78
+ const existing = sessionStorage.getItem(SESSION_KEY);
79
+ const lastTouch = sessionStorage.getItem(SESSION_TOUCH_KEY);
80
+ if (existing && lastTouch) {
81
+ const elapsed = Date.now() - parseInt(lastTouch, 10);
82
+ const timeoutMs = this.config.sessionTimeoutMinutes * 60 * 1000;
83
+ if (elapsed < timeoutMs) {
84
+ sessionStorage.setItem(SESSION_TOUCH_KEY, String(Date.now()));
85
+ this.sessionId = existing;
86
+ return existing;
87
+ }
88
+ }
89
+ // Create new session
90
+ const newSession = this.generateSessionId();
91
+ sessionStorage.setItem(SESSION_KEY, newSession);
92
+ sessionStorage.setItem(SESSION_TOUCH_KEY, String(Date.now()));
93
+ this.sessionId = newSession;
94
+ return newSession;
95
+ }
96
+ catch {
97
+ return this.getMemorySessionId();
98
+ }
99
+ }
100
+ /**
101
+ * Update the visitor ID (e.g. after identify() links anonymous → known user).
102
+ * Persists to cookie + localStorage.
103
+ */
104
+ setVisitorId(id) {
105
+ this.visitorId = id;
106
+ this.persistVisitorId(id);
107
+ }
108
+ /** Clear session (e.g. on logout). */
109
+ clearSession() {
110
+ this.sessionId = '';
111
+ delete this.memoryStore[SESSION_KEY];
112
+ delete this.memoryStore[SESSION_TOUCH_KEY];
113
+ if (this.detectBrowser()) {
114
+ try {
115
+ sessionStorage.removeItem(SESSION_KEY);
116
+ sessionStorage.removeItem(SESSION_TOUCH_KEY);
117
+ }
118
+ catch { /* SSR / privacy mode */ }
119
+ }
120
+ }
121
+ /** Clear all identity (GDPR). Removes visitor + session + experiment assignments. */
122
+ clearAll() {
123
+ this.visitorId = '';
124
+ this.sessionId = '';
125
+ this.memoryStore = {};
126
+ if (!this.detectBrowser())
127
+ return;
128
+ try {
129
+ // Cookies
130
+ this.deleteCookie(this.visitorCookieName);
131
+ this.deleteCookie(LEGACY_VISITOR_COOKIE);
132
+ // localStorage
133
+ localStorage.removeItem(this.visitorCookieName);
134
+ localStorage.removeItem(LEGACY_VISITOR_COOKIE);
135
+ localStorage.removeItem('fg_exp_assignments');
136
+ // sessionStorage
137
+ sessionStorage.removeItem(SESSION_KEY);
138
+ sessionStorage.removeItem(SESSION_TOUCH_KEY);
139
+ }
140
+ catch { /* SSR / privacy mode */ }
141
+ }
142
+ /** Check if running in a browser environment. */
143
+ isBrowser() {
144
+ return this.detectBrowser();
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // PRIVATE — VISITOR RESOLUTION
148
+ // ---------------------------------------------------------------------------
149
+ /** Returns the primary cookie name based on compat mode */
150
+ get visitorCookieName() {
151
+ return this.config.compat ? COMPAT_VISITOR_COOKIE : LEGACY_VISITOR_COOKIE;
152
+ }
153
+ resolveVisitorId() {
154
+ // 1. Explicit config
155
+ if (this.config.visitorId)
156
+ return this.config.visitorId;
157
+ // 2. track.js backward compat (cookie/localStorage `visitor_id`)
158
+ if (this.detectBrowser()) {
159
+ const trackJsId = getTrackJsVisitorId();
160
+ if (trackJsId) {
161
+ // Migration: if fg_visitor_id exists with a different value, prefer visitor_id (track.js was first)
162
+ const legacyId = this.readCookie(LEGACY_VISITOR_COOKIE) || this.readLocalStorage(LEGACY_VISITOR_COOKIE);
163
+ if (legacyId && legacyId !== trackJsId) {
164
+ // Merge identities by keeping track.js id as canonical
165
+ this.removeLegacyCookie();
166
+ }
167
+ this.persistVisitorId(trackJsId);
168
+ return trackJsId;
169
+ }
170
+ }
171
+ // 3. Migration: fg_visitor_id → visitor_id
172
+ if (this.config.compat) {
173
+ const legacyId = this.readCookie(LEGACY_VISITOR_COOKIE) || this.readLocalStorage(LEGACY_VISITOR_COOKIE);
174
+ if (legacyId) {
175
+ this.persistVisitorId(legacyId);
176
+ this.removeLegacyCookie();
177
+ return legacyId;
178
+ }
179
+ }
180
+ // 4. Own cookie
181
+ const cookieId = this.readCookie(this.visitorCookieName);
182
+ if (cookieId)
183
+ return cookieId;
184
+ // 5. localStorage
185
+ if (this.detectBrowser()) {
186
+ try {
187
+ const lsId = localStorage.getItem(this.visitorCookieName);
188
+ if (lsId)
189
+ return lsId;
190
+ }
191
+ catch { /* unavailable */ }
192
+ }
193
+ // 6. Server cookie reader
194
+ if (this.config.serverCookies) {
195
+ const serverVal = this.readServerCookie(this.visitorCookieName);
196
+ if (serverVal)
197
+ return serverVal;
198
+ }
199
+ // 7. Memory store
200
+ if (this.memoryStore[this.visitorCookieName]) {
201
+ return this.memoryStore[this.visitorCookieName];
202
+ }
203
+ // 8. Generate new ID
204
+ const newId = this.generateVisitorId();
205
+ this.persistVisitorId(newId);
206
+ return newId;
207
+ }
208
+ readLocalStorage(key) {
209
+ if (!this.detectBrowser())
210
+ return null;
211
+ try {
212
+ return localStorage.getItem(key);
213
+ }
214
+ catch {
215
+ return null;
216
+ }
217
+ }
218
+ removeLegacyCookie() {
219
+ this.deleteCookie(LEGACY_VISITOR_COOKIE);
220
+ if (this.detectBrowser()) {
221
+ try {
222
+ localStorage.removeItem(LEGACY_VISITOR_COOKIE);
223
+ }
224
+ catch { /* */ }
225
+ }
226
+ }
227
+ persistVisitorId(id) {
228
+ const cookieName = this.visitorCookieName;
229
+ if (this.config.storage === 'memory') {
230
+ this.memoryStore[cookieName] = id;
231
+ return;
232
+ }
233
+ if (!this.detectBrowser()) {
234
+ this.memoryStore[cookieName] = id;
235
+ return;
236
+ }
237
+ // Cookie
238
+ this.writeCookie(cookieName, id, this.config.visitorMaxAgeDays);
239
+ // localStorage as fallback
240
+ try {
241
+ localStorage.setItem(cookieName, id);
242
+ }
243
+ catch { /* unavailable */ }
244
+ }
245
+ // ---------------------------------------------------------------------------
246
+ // PRIVATE — SESSION HELPERS
247
+ // ---------------------------------------------------------------------------
248
+ getMemorySessionId() {
249
+ const existing = this.memoryStore[SESSION_KEY];
250
+ const lastTouch = this.memoryStore[SESSION_TOUCH_KEY];
251
+ if (existing && lastTouch) {
252
+ const elapsed = Date.now() - parseInt(lastTouch, 10);
253
+ const timeoutMs = this.config.sessionTimeoutMinutes * 60 * 1000;
254
+ if (elapsed < timeoutMs) {
255
+ this.memoryStore[SESSION_TOUCH_KEY] = String(Date.now());
256
+ this.sessionId = existing;
257
+ return existing;
258
+ }
259
+ }
260
+ const newSession = this.generateSessionId();
261
+ this.memoryStore[SESSION_KEY] = newSession;
262
+ this.memoryStore[SESSION_TOUCH_KEY] = String(Date.now());
263
+ this.sessionId = newSession;
264
+ return newSession;
265
+ }
266
+ // ---------------------------------------------------------------------------
267
+ // PRIVATE — COOKIE OPERATIONS
268
+ // ---------------------------------------------------------------------------
269
+ readCookie(name) {
270
+ // Server-side reader first
271
+ if (this.config.serverCookies) {
272
+ return this.readServerCookie(name);
273
+ }
274
+ // Browser cookie
275
+ if (this.detectBrowser()) {
276
+ return getCookie(name);
277
+ }
278
+ return null;
279
+ }
280
+ readServerCookie(name) {
281
+ if (!this.config.serverCookies)
282
+ return null;
283
+ const result = this.config.serverCookies.get(name);
284
+ if (!result)
285
+ return null;
286
+ // Next.js cookies().get() returns { value: string }
287
+ if (typeof result === 'object' && 'value' in result)
288
+ return result.value || null;
289
+ // Nuxt useCookie() returns string directly
290
+ if (typeof result === 'string')
291
+ return result || null;
292
+ return null;
293
+ }
294
+ writeCookie(name, value, maxAgeDays) {
295
+ if (!this.detectBrowser())
296
+ return;
297
+ const maxAge = maxAgeDays * 24 * 60 * 60;
298
+ const domain = this.config.cookieDomain ? `; Domain=${this.config.cookieDomain}` : '';
299
+ const secure = location.protocol === 'https:' ? '; Secure' : '';
300
+ document.cookie = `${name}=${encodeURIComponent(value)}; Path=/; Max-Age=${maxAge}; SameSite=Lax${secure}${domain}`;
301
+ }
302
+ deleteCookie(name) {
303
+ if (!this.detectBrowser())
304
+ return;
305
+ const domain = this.config.cookieDomain ? `; Domain=${this.config.cookieDomain}` : '';
306
+ document.cookie = `${name}=; Path=/; Max-Age=0${domain}`;
307
+ }
308
+ // ---------------------------------------------------------------------------
309
+ // PRIVATE — ID GENERATION
310
+ // ---------------------------------------------------------------------------
311
+ generateVisitorId() {
312
+ return `fg_${this.uuidV4()}`;
313
+ }
314
+ generateSessionId() {
315
+ return `fgs_${Date.now()}_${this.randomHex(8)}`;
316
+ }
317
+ uuidV4() {
318
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
319
+ return crypto.randomUUID();
320
+ }
321
+ // Fallback for environments without crypto.randomUUID
322
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
323
+ const r = (Math.random() * 16) | 0;
324
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
325
+ return v.toString(16);
326
+ });
327
+ }
328
+ randomHex(length) {
329
+ const bytes = new Uint8Array(length);
330
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
331
+ crypto.getRandomValues(bytes);
332
+ }
333
+ else {
334
+ for (let i = 0; i < length; i++)
335
+ bytes[i] = Math.floor(Math.random() * 256);
336
+ }
337
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
338
+ }
339
+ // ---------------------------------------------------------------------------
340
+ // PRIVATE — ENVIRONMENT DETECTION
341
+ // ---------------------------------------------------------------------------
342
+ detectBrowser() {
343
+ return typeof window !== 'undefined' && typeof document !== 'undefined';
344
+ }
345
+ }
346
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/lib/utils/identity.ts"],"names":[],"mappings":"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"}