flowgrid-sdk 1.2.1 → 1.4.1

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 +221 -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,268 @@
1
+ /**
2
+ * @fileoverview Product Analytics - Page View Tracking
3
+ * @module features/analytics/page-views
4
+ *
5
+ * @description
6
+ * Track page views with rich context including scroll depth, time on page,
7
+ * referrer information, and user engagement signals.
8
+ *
9
+ * @useCases
10
+ * - Track which pages users visit most frequently
11
+ * - Measure time spent on content pages
12
+ * - Identify high bounce rate pages
13
+ * - Analyze user navigation patterns
14
+ * - Monitor landing page performance
15
+ *
16
+ * @metrics
17
+ * - Total page views
18
+ * - Unique page views
19
+ * - Average time on page
20
+ * - Bounce rate by page
21
+ * - Scroll depth distribution
22
+ * - Entry/exit page analysis
23
+ *
24
+ * @chartData
25
+ * - Line chart: Page views over time
26
+ * - Bar chart: Top pages by views
27
+ * - Heatmap: Scroll depth by page
28
+ * - Funnel: Page flow analysis
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const pageViews = new PageViews(webId, endpoint, apiKey);
33
+ *
34
+ * // Track a page view
35
+ * await pageViews.track({
36
+ * url: window.location.href,
37
+ * path: window.location.pathname,
38
+ * title: document.title,
39
+ * referrer: document.referrer
40
+ * });
41
+ *
42
+ * // Track with scroll depth
43
+ * await pageViews.trackScrollDepth({
44
+ * path: '/blog/article-1',
45
+ * scrollDepth: 75
46
+ * });
47
+ * ```
48
+ */
49
+ import { FlowGridTransport } from "../../client/transport";
50
+ import { getWindow, getDocument, isBrowser, combineTeardowns } from "../../utils/browser";
51
+ // ============================================================================
52
+ // PAGE VIEWS CLASS
53
+ // ============================================================================
54
+ /**
55
+ * PageViews - Track and analyze page view events.
56
+ *
57
+ * @extends FlowGridTransport
58
+ *
59
+ * @description
60
+ * Provides comprehensive page view tracking with support for:
61
+ * - Basic page view events
62
+ * - Scroll depth tracking
63
+ * - Time on page measurement
64
+ * - Exit intent detection
65
+ * - Page engagement scoring
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const pageViews = new PageViews(webId, endpoint, apiKey);
70
+ *
71
+ * // Basic page view
72
+ * await pageViews.track({
73
+ * url: 'https://example.com/products',
74
+ * path: '/products',
75
+ * title: 'Our Products'
76
+ * });
77
+ * ```
78
+ */
79
+ export class PageViews extends FlowGridTransport {
80
+ /**
81
+ * Tracks a page view event.
82
+ *
83
+ * @param config - Page view configuration
84
+ * @returns Promise resolving to the API response
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * await pageViews.track({
89
+ * url: window.location.href,
90
+ * path: window.location.pathname,
91
+ * title: document.title
92
+ * });
93
+ * ```
94
+ */
95
+ async track(config) {
96
+ return await this.init("page_view", {
97
+ type: "page_view",
98
+ url: config.url,
99
+ path: config.path,
100
+ title: config.title || "",
101
+ referrer: config.referrer || "",
102
+ userId: config.userId,
103
+ sessionId: config.sessionId,
104
+ ...config.properties,
105
+ timestamp: new Date().toISOString()
106
+ });
107
+ }
108
+ /**
109
+ * Tracks scroll depth on a page.
110
+ *
111
+ * @param config - Scroll depth configuration
112
+ * @returns Promise resolving to the API response
113
+ *
114
+ * @example
115
+ * ```typescript
116
+ * // Track when user scrolls to 50%
117
+ * await pageViews.trackScrollDepth({
118
+ * path: '/article/how-to-guide',
119
+ * scrollDepth: 50
120
+ * });
121
+ * ```
122
+ */
123
+ async trackScrollDepth(config) {
124
+ return await this.init("scroll_depth", {
125
+ type: "scroll_depth",
126
+ path: config.path,
127
+ scrollDepth: Math.min(100, Math.max(0, config.scrollDepth)),
128
+ timeAtDepth: config.timeAtDepth,
129
+ timestamp: new Date().toISOString()
130
+ });
131
+ }
132
+ /**
133
+ * Tracks time spent on a page.
134
+ *
135
+ * @param config - Time on page configuration
136
+ * @returns Promise resolving to the API response
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * // Track on page unload
141
+ * window.addEventListener('beforeunload', () => {
142
+ * pageViews.trackTimeOnPage({
143
+ * path: '/pricing',
144
+ * duration: 45,
145
+ * engaged: true
146
+ * });
147
+ * });
148
+ * ```
149
+ */
150
+ async trackTimeOnPage(config) {
151
+ return await this.init("time_on_page", {
152
+ type: "time_on_page",
153
+ path: config.path,
154
+ duration: config.duration,
155
+ engaged: config.engaged ?? false,
156
+ timestamp: new Date().toISOString()
157
+ });
158
+ }
159
+ /**
160
+ * Tracks a page exit event.
161
+ *
162
+ * @param path - Page path being exited
163
+ * @param duration - Time spent on page
164
+ * @param scrollDepth - Final scroll depth
165
+ * @returns Promise resolving to the API response
166
+ */
167
+ async trackExit(path, duration, scrollDepth) {
168
+ return await this.init("page_exit", {
169
+ type: "page_exit",
170
+ path,
171
+ duration,
172
+ scrollDepth,
173
+ timestamp: new Date().toISOString()
174
+ });
175
+ }
176
+ /**
177
+ * Auto-track page views for both classic full-page navigations and SPA
178
+ * route changes (history.pushState / replaceState / popstate). Also wires
179
+ * scroll-depth thresholds (25/50/75/100%) and a final time-on-page event
180
+ * when the page is hidden or unloaded.
181
+ *
182
+ * @returns A teardown function that detaches every listener.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * const stop = fg.pageViews.client.autoTrack({ userId: "u_1" });
187
+ * ```
188
+ */
189
+ autoTrack(options = {}) {
190
+ if (!isBrowser())
191
+ return () => { };
192
+ const win = getWindow();
193
+ const doc = getDocument();
194
+ let currentPath = win.location.pathname;
195
+ let pageStart = Date.now();
196
+ let maxDepth = 0;
197
+ const sentDepths = new Set();
198
+ const fireView = () => {
199
+ void this.track({
200
+ url: win.location.href,
201
+ path: win.location.pathname,
202
+ title: doc.title,
203
+ referrer: doc.referrer,
204
+ userId: options.userId,
205
+ sessionId: options.sessionId,
206
+ });
207
+ };
208
+ const flushTimeOnPage = () => {
209
+ const duration = Math.round((Date.now() - pageStart) / 1000);
210
+ if (duration <= 0)
211
+ return;
212
+ void this.trackTimeOnPage({ path: currentPath, duration, engaged: maxDepth > 10 });
213
+ };
214
+ const onRouteChange = () => {
215
+ if (win.location.pathname === currentPath)
216
+ return;
217
+ flushTimeOnPage();
218
+ currentPath = win.location.pathname;
219
+ pageStart = Date.now();
220
+ maxDepth = 0;
221
+ sentDepths.clear();
222
+ fireView();
223
+ };
224
+ // Patch history methods so we can detect SPA route changes.
225
+ const origPush = win.history.pushState;
226
+ const origReplace = win.history.replaceState;
227
+ win.history.pushState = function (...args) {
228
+ const r = origPush.apply(this, args);
229
+ win.dispatchEvent(new Event("flowgrid:locationchange"));
230
+ return r;
231
+ };
232
+ win.history.replaceState = function (...args) {
233
+ const r = origReplace.apply(this, args);
234
+ win.dispatchEvent(new Event("flowgrid:locationchange"));
235
+ return r;
236
+ };
237
+ const popHandler = () => onRouteChange();
238
+ const locHandler = () => onRouteChange();
239
+ win.addEventListener("popstate", popHandler);
240
+ win.addEventListener("flowgrid:locationchange", locHandler);
241
+ // Scroll-depth thresholds.
242
+ const onScroll = () => {
243
+ const docEl = doc.documentElement;
244
+ const scrollTop = win.scrollY || docEl.scrollTop;
245
+ const height = Math.max(1, docEl.scrollHeight - win.innerHeight);
246
+ const depth = Math.min(100, Math.round((scrollTop / height) * 100));
247
+ if (depth > maxDepth)
248
+ maxDepth = depth;
249
+ for (const t of [25, 50, 75, 100]) {
250
+ if (depth >= t && !sentDepths.has(t)) {
251
+ sentDepths.add(t);
252
+ void this.trackScrollDepth({ path: currentPath, scrollDepth: t });
253
+ }
254
+ }
255
+ };
256
+ win.addEventListener("scroll", onScroll, { passive: true });
257
+ // Flush on unload / visibility change.
258
+ const onHide = () => { if (doc.visibilityState === "hidden")
259
+ flushTimeOnPage(); };
260
+ doc.addEventListener("visibilitychange", onHide);
261
+ win.addEventListener("pagehide", flushTimeOnPage);
262
+ // Initial view.
263
+ fireView();
264
+ return combineTeardowns(() => win.removeEventListener("popstate", popHandler), () => win.removeEventListener("flowgrid:locationchange", locHandler), () => win.removeEventListener("scroll", onScroll), () => doc.removeEventListener("visibilitychange", onHide), () => win.removeEventListener("pagehide", flushTimeOnPage), () => { win.history.pushState = origPush; win.history.replaceState = origReplace; });
265
+ }
266
+ }
267
+ export default PageViews;
268
+ //# sourceMappingURL=page-views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-views.js","sourceRoot":"","sources":["../../../../src/lib/features/analytics/page-views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAY,MAAM,qBAAqB,CAAC;AAgGpG,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,SAAU,SAAQ,iBAAiB;IAC9C;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,KAAK,CAAC,MAAsB;QAChC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAClC,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,MAAM,CAAC,UAAU;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAAyB;QAC9C,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACrC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YAC3D,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,eAAe,CAAC,MAAwB;QAC5C,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACrC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;YAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CACb,IAAY,EACZ,QAAgB,EAChB,WAAmB;QAEnB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAClC,IAAI,EAAE,WAAW;YACjB,IAAI;YACJ,QAAQ;YACR,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,UAAmD,EAAE;QAC7D,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,GAAG,EAAE,GAA6B,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,SAAS,EAAG,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,EAAG,CAAC;QAE3B,IAAI,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAErC,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,KAAK,IAAI,CAAC,KAAK,CAAC;gBACd,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;gBACtB,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7D,IAAI,QAAQ,IAAI,CAAC;gBAAE,OAAO;YAC1B,KAAK,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC;QACrF,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW;gBAAE,OAAO;YAClD,eAAe,EAAE,CAAC;YAClB,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,QAAQ,GAAG,CAAC,CAAC;YACb,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC;QAEF,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QACvC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7C,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI;YACvC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAI;YAC1C,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;QACF,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QACzC,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC7C,GAAG,CAAC,gBAAgB,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;QAE5D,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,MAAM,KAAK,GAAG,GAAG,CAAC,eAAe,CAAC;YAClC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACpE,IAAI,KAAK,GAAG,QAAQ;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAClB,KAAK,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,uCAAuC;QACvC,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,eAAe,KAAK,QAAQ;YAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACjD,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAElD,gBAAgB;QAChB,QAAQ,EAAE,CAAC;QAEX,OAAO,gBAAgB,CACrB,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,EACrD,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,UAAU,CAAC,EACpE,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EACjD,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,CAAC,EACzD,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,eAAe,CAAC,EAC1D,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,CACpF,CAAC;IACJ,CAAC;CACF;AAED,eAAe,SAAS,CAAC"}
@@ -40,7 +40,8 @@
40
40
  * ```
41
41
  */
42
42
  import { FlowGridTransport } from "../../client/transport";
43
- import { DateRangeFilter, TimeSeriesData } from "../../types";
43
+ import { TimeSeriesData } from "../../types";
44
+ import { Teardown } from "../../utils/browser";
44
45
  /**
45
46
  * Core Web Vitals data.
46
47
  */
@@ -213,10 +214,6 @@ export interface PerformanceAnalyticsData {
213
214
  * pageUrl: window.location.pathname
214
215
  * });
215
216
  * });
216
- *
217
- * // Get performance report
218
- * const report = await performance.getAnalytics({ range: 'last7days' });
219
- * console.log(`Performance Score: ${report.performanceScore}`);
220
217
  * ```
221
218
  */
222
219
  export declare class PerformanceTracking extends FlowGridTransport {
@@ -252,30 +249,27 @@ export declare class PerformanceTracking extends FlowGridTransport {
252
249
  */
253
250
  trackApiCall(endpoint: string, duration: number, success: boolean, statusCode?: number): Promise<PerformanceResponse>;
254
251
  /**
255
- * Gets performance analytics for dashboards.
252
+ * Auto-collect Core Web Vitals, navigation timing, and resource timing
253
+ * directly from the browser. Safe no-op outside the browser.
256
254
  *
257
- * @param filter - Date range filter
258
- * @returns Promise resolving to performance analytics
255
+ * @param options.userId Optional user identifier attached to every metric.
256
+ * @param options.resources When true, also subscribes to PerformanceObserver
257
+ * for `resource` entries. Default: false (noisy).
258
+ * @param options.minDuration Only forward resources slower than this (ms). Default 200.
259
+ * @returns A teardown function that detaches all observers/listeners.
259
260
  *
260
261
  * @example
261
- * ```typescript
262
- * const analytics = await performance.getAnalytics({
263
- * range: 'last7days'
264
- * });
265
- *
266
- * // Gauge - performance score
267
- * const score = analytics.performanceScore;
268
- *
269
- * // Line chart - LCP trend
270
- * const lcpTrend = analytics.trends.lcp.data;
271
- *
272
- * // Table - slowest pages
273
- * const slowPages = analytics.byPage.sort((a, b) =>
274
- * b.avgLoadTime - a.avgLoadTime
275
- * );
262
+ * ```ts
263
+ * const stop = fg.performance.client.autoTrack({ userId: "u_1" });
264
+ * // ...later
265
+ * stop();
276
266
  * ```
277
267
  */
278
- getAnalytics(filter?: DateRangeFilter): Promise<PerformanceAnalyticsData>;
268
+ autoTrack(options?: {
269
+ userId?: string;
270
+ resources?: boolean;
271
+ minDuration?: number;
272
+ }): Teardown;
279
273
  }
280
274
  export { PerformanceTracking as Performance };
281
275
  export default PerformanceTracking;
@@ -0,0 +1,232 @@
1
+ /**
2
+ * @fileoverview Product Analytics - Performance Monitoring
3
+ * @module features/analytics/performance
4
+ *
5
+ * @description
6
+ * Track web performance metrics including Core Web Vitals,
7
+ * page load times, and resource performance.
8
+ *
9
+ * @useCases
10
+ * - Monitor Core Web Vitals (LCP, FID, CLS)
11
+ * - Track page load performance
12
+ * - Identify slow pages and resources
13
+ * - Correlate performance with conversions
14
+ * - Monitor API response times
15
+ *
16
+ * @metrics
17
+ * - Largest Contentful Paint (LCP)
18
+ * - First Input Delay (FID)
19
+ * - Cumulative Layout Shift (CLS)
20
+ * - Time to First Byte (TTFB)
21
+ * - First Contentful Paint (FCP)
22
+ *
23
+ * @chartData
24
+ * - Line chart: Core Web Vitals over time
25
+ * - Bar chart: Slowest pages
26
+ * - Histogram: Load time distribution
27
+ * - Gauge: Performance score
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const performance = new Performance(webId, endpoint, apiKey);
32
+ *
33
+ * // Track Core Web Vitals
34
+ * await performance.trackWebVitals({
35
+ * lcp: 2500,
36
+ * fid: 100,
37
+ * cls: 0.1,
38
+ * pageUrl: '/products'
39
+ * });
40
+ * ```
41
+ */
42
+ import { FlowGridTransport } from "../../client/transport";
43
+ import { getWindow, isBrowser, combineTeardowns } from "../../utils/browser";
44
+ // ============================================================================
45
+ // PERFORMANCE CLASS
46
+ // ============================================================================
47
+ /**
48
+ * Performance - Track web performance metrics.
49
+ *
50
+ * @extends FlowGridTransport
51
+ *
52
+ * @description
53
+ * Provides performance monitoring including:
54
+ * - Core Web Vitals tracking
55
+ * - Page load timing
56
+ * - Resource performance
57
+ * - API response times
58
+ * - Performance scoring
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const performance = new Performance(webId, endpoint, apiKey);
63
+ *
64
+ * // Track Web Vitals (use web-vitals library)
65
+ * import { onLCP, onFID, onCLS } from 'web-vitals';
66
+ *
67
+ * onLCP((metric) => {
68
+ * performance.trackWebVitals({
69
+ * lcp: metric.value,
70
+ * pageUrl: window.location.pathname
71
+ * });
72
+ * });
73
+ * ```
74
+ */
75
+ export class PerformanceTracking extends FlowGridTransport {
76
+ /**
77
+ * Tracks Core Web Vitals.
78
+ *
79
+ * @param data - Web Vitals data
80
+ * @returns Promise resolving to performance response
81
+ */
82
+ async trackWebVitals(data) {
83
+ return await this.init("web_vitals", {
84
+ type: "web_vitals",
85
+ ...data,
86
+ timestamp: new Date().toISOString()
87
+ });
88
+ }
89
+ /**
90
+ * Tracks page load timing.
91
+ *
92
+ * @param data - Page load data
93
+ * @returns Promise resolving to performance response
94
+ */
95
+ async trackPageLoad(data) {
96
+ return await this.init("page_load", {
97
+ type: "page_load",
98
+ ...data,
99
+ timestamp: new Date().toISOString()
100
+ });
101
+ }
102
+ /**
103
+ * Tracks resource performance.
104
+ *
105
+ * @param data - Resource data
106
+ * @returns Promise resolving to performance response
107
+ */
108
+ async trackResource(data) {
109
+ return await this.init("resource_timing", {
110
+ type: "resource_timing",
111
+ ...data,
112
+ timestamp: new Date().toISOString()
113
+ });
114
+ }
115
+ /**
116
+ * Tracks API call performance.
117
+ *
118
+ * @param endpoint - API endpoint
119
+ * @param duration - Response time (ms)
120
+ * @param success - Whether call succeeded
121
+ * @param statusCode - HTTP status code
122
+ * @returns Promise resolving to performance response
123
+ */
124
+ async trackApiCall(endpoint, duration, success, statusCode) {
125
+ return await this.init("api_timing", {
126
+ type: "api_timing",
127
+ endpoint,
128
+ duration,
129
+ success,
130
+ statusCode,
131
+ timestamp: new Date().toISOString()
132
+ });
133
+ }
134
+ /**
135
+ * Auto-collect Core Web Vitals, navigation timing, and resource timing
136
+ * directly from the browser. Safe no-op outside the browser.
137
+ *
138
+ * @param options.userId Optional user identifier attached to every metric.
139
+ * @param options.resources When true, also subscribes to PerformanceObserver
140
+ * for `resource` entries. Default: false (noisy).
141
+ * @param options.minDuration Only forward resources slower than this (ms). Default 200.
142
+ * @returns A teardown function that detaches all observers/listeners.
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * const stop = fg.performance.client.autoTrack({ userId: "u_1" });
147
+ * // ...later
148
+ * stop();
149
+ * ```
150
+ */
151
+ autoTrack(options = {}) {
152
+ if (!isBrowser())
153
+ return () => { };
154
+ const win = getWindow();
155
+ const pageUrl = win.location.pathname;
156
+ const teardowns = [];
157
+ // --- Web Vitals via the `web-vitals` library (dynamic import keeps it
158
+ // out of server bundles even if tree-shaking misses it).
159
+ let cancelled = false;
160
+ void import("web-vitals").then((wv) => {
161
+ if (cancelled)
162
+ return;
163
+ const send = (metric) => {
164
+ const key = metric.name.toLowerCase();
165
+ const payload = { pageUrl, userId: options.userId };
166
+ payload[key] = metric.value;
167
+ void this.trackWebVitals(payload);
168
+ };
169
+ wv.onLCP?.(send);
170
+ wv.onCLS?.(send);
171
+ wv.onINP?.(send);
172
+ wv.onFCP?.(send);
173
+ wv.onTTFB?.(send);
174
+ // FID was removed in web-vitals v4+, but we still surface it if present
175
+ wv.onFID?.(send);
176
+ }).catch(() => { });
177
+ teardowns.push(() => { cancelled = true; });
178
+ // --- PerformanceNavigationTiming → trackPageLoad
179
+ const reportNavigation = () => {
180
+ const nav = win.performance?.getEntriesByType?.("navigation")?.[0];
181
+ if (!nav)
182
+ return;
183
+ void this.trackPageLoad({
184
+ pageUrl,
185
+ dnsTime: Math.max(0, nav.domainLookupEnd - nav.domainLookupStart),
186
+ tcpTime: Math.max(0, nav.connectEnd - nav.connectStart),
187
+ ttfb: Math.max(0, nav.responseStart - nav.requestStart),
188
+ domContentLoaded: nav.domContentLoadedEventEnd,
189
+ loadTime: nav.loadEventEnd,
190
+ domInteractive: nav.domInteractive,
191
+ transferSize: nav.transferSize,
192
+ });
193
+ };
194
+ if (win.document.readyState === "complete") {
195
+ reportNavigation();
196
+ }
197
+ else {
198
+ const onLoad = () => reportNavigation();
199
+ win.addEventListener("load", onLoad, { once: true });
200
+ teardowns.push(() => win.removeEventListener("load", onLoad));
201
+ }
202
+ // --- Resource timing (opt-in)
203
+ if (options.resources && typeof win.PerformanceObserver === "function") {
204
+ const min = options.minDuration ?? 200;
205
+ const obs = new win.PerformanceObserver((list) => {
206
+ for (const entry of list.getEntries()) {
207
+ if (entry.duration < min)
208
+ continue;
209
+ const initiator = entry.initiatorType;
210
+ void this.trackResource({
211
+ resourceUrl: entry.name,
212
+ resourceType: ([
213
+ "script", "stylesheet", "image", "font", "fetch", "xhr",
214
+ ].includes(initiator) ? initiator : "other"),
215
+ duration: Math.round(entry.duration),
216
+ transferSize: entry.transferSize,
217
+ pageUrl,
218
+ });
219
+ }
220
+ });
221
+ try {
222
+ obs.observe({ type: "resource", buffered: true });
223
+ teardowns.push(() => obs.disconnect());
224
+ }
225
+ catch { /* unsupported */ }
226
+ }
227
+ return combineTeardowns(...teardowns);
228
+ }
229
+ }
230
+ export { PerformanceTracking as Performance };
231
+ export default PerformanceTracking;
232
+ //# sourceMappingURL=performance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../../src/lib/features/analytics/performance.ts"],"names":[],"mappings":"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"}