flowgrid-sdk 1.2.0 → 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.
- package/README.md +224 -250
- package/dist/237.flowgrid.min.js +2 -0
- package/dist/237.flowgrid.min.js.map +1 -0
- package/dist/546.flowgrid.min.js +3 -0
- package/dist/546.flowgrid.min.js.LICENSE.txt +14 -0
- package/dist/546.flowgrid.min.js.map +1 -0
- package/dist/EXAMPLE.d.ts +1 -0
- package/dist/EXAMPLE.js +55 -0
- package/dist/EXAMPLE.js.map +1 -0
- package/dist/browser.d.ts +46 -103
- package/dist/browser.js +102 -0
- package/dist/browser.js.map +1 -0
- package/dist/flowgrid.min.js +1 -1
- package/dist/flowgrid.min.js.map +1 -1
- package/dist/index.d.ts +7 -8
- package/dist/index.js +64 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/client/transport.d.ts +14 -4
- package/dist/lib/client/transport.js +432 -0
- package/dist/lib/client/transport.js.map +1 -0
- package/dist/lib/consent/index.d.ts +0 -5
- package/dist/lib/consent/index.js +32 -0
- package/dist/lib/consent/index.js.map +1 -0
- package/dist/lib/consent/manager.js +336 -0
- package/dist/lib/consent/manager.js.map +1 -0
- package/dist/lib/consent/types.d.ts +3 -20
- package/dist/lib/consent/types.js +10 -0
- package/dist/lib/consent/types.js.map +1 -0
- package/dist/lib/features/analytics/attribution.d.ts +6 -47
- package/dist/lib/features/analytics/attribution.js +181 -0
- package/dist/lib/features/analytics/attribution.js.map +1 -0
- package/dist/lib/features/analytics/events.d.ts +1 -28
- package/dist/lib/features/analytics/events.js +256 -0
- package/dist/lib/features/analytics/events.js.map +1 -0
- package/dist/lib/features/analytics/funnels.js +260 -0
- package/dist/lib/features/analytics/funnels.js.map +1 -0
- package/dist/lib/features/analytics/heatmaps.d.ts +12 -19
- package/dist/lib/features/analytics/heatmaps.js +258 -0
- package/dist/lib/features/analytics/heatmaps.js.map +1 -0
- package/dist/lib/features/analytics/identify.d.ts +1 -21
- package/dist/lib/features/analytics/identify.js +213 -0
- package/dist/lib/features/analytics/identify.js.map +1 -0
- package/dist/lib/features/analytics/index.d.ts +2 -0
- package/dist/lib/features/analytics/index.js +15 -0
- package/dist/lib/features/analytics/index.js.map +1 -0
- package/dist/lib/features/analytics/page-views.d.ts +13 -30
- package/dist/lib/features/analytics/page-views.js +268 -0
- package/dist/lib/features/analytics/page-views.js.map +1 -0
- package/dist/lib/features/analytics/performance.d.ts +18 -24
- package/dist/lib/features/analytics/performance.js +232 -0
- package/dist/lib/features/analytics/performance.js.map +1 -0
- package/dist/lib/features/analytics/replay.d.ts +170 -0
- package/dist/lib/features/analytics/replay.js +381 -0
- package/dist/lib/features/analytics/replay.js.map +1 -0
- package/dist/lib/features/analytics/retention.d.ts +1 -76
- package/dist/lib/features/analytics/retention.js +135 -0
- package/dist/lib/features/analytics/retention.js.map +1 -0
- package/dist/lib/features/analytics/sessions.d.ts +12 -37
- package/dist/lib/features/analytics/sessions.js +213 -0
- package/dist/lib/features/analytics/sessions.js.map +1 -0
- package/dist/lib/features/core/activation.d.ts +1 -24
- package/dist/lib/features/core/activation.js +175 -0
- package/dist/lib/features/core/activation.js.map +1 -0
- package/dist/lib/features/core/experiment.d.ts +53 -21
- package/dist/lib/features/core/experiment.js +554 -0
- package/dist/lib/features/core/experiment.js.map +1 -0
- package/dist/lib/features/core/index.js +9 -0
- package/dist/lib/features/core/index.js.map +1 -0
- package/dist/lib/features/core/track-feature.d.ts +1 -8
- package/dist/lib/features/core/track-feature.js +119 -0
- package/dist/lib/features/core/track-feature.js.map +1 -0
- package/dist/lib/features/core/track-prompt.d.ts +5 -8
- package/dist/lib/features/core/track-prompt.js +181 -0
- package/dist/lib/features/core/track-prompt.js.map +1 -0
- package/dist/lib/features/ecommerce/cart.d.ts +1 -24
- package/dist/lib/features/ecommerce/cart.js +244 -0
- package/dist/lib/features/ecommerce/cart.js.map +1 -0
- package/dist/lib/features/ecommerce/checkout.d.ts +1 -28
- package/dist/lib/features/ecommerce/checkout.js +254 -0
- package/dist/lib/features/ecommerce/checkout.js.map +1 -0
- package/dist/lib/features/ecommerce/index.d.ts +0 -2
- package/dist/lib/features/ecommerce/index.js +15 -0
- package/dist/lib/features/ecommerce/index.js.map +1 -0
- package/dist/lib/features/ecommerce/ltv.d.ts +1 -69
- package/dist/lib/features/ecommerce/ltv.js +114 -0
- package/dist/lib/features/ecommerce/ltv.js.map +1 -0
- package/dist/lib/features/ecommerce/products.d.ts +1 -33
- package/dist/lib/features/ecommerce/products.js +223 -0
- package/dist/lib/features/ecommerce/products.js.map +1 -0
- package/dist/lib/features/ecommerce/promotions.d.ts +1 -30
- package/dist/lib/features/ecommerce/promotions.js +197 -0
- package/dist/lib/features/ecommerce/promotions.js.map +1 -0
- package/dist/lib/features/ecommerce/purchases.d.ts +1 -48
- package/dist/lib/features/ecommerce/purchases.js +193 -0
- package/dist/lib/features/ecommerce/purchases.js.map +1 -0
- package/dist/lib/features/ecommerce/refunds.d.ts +1 -27
- package/dist/lib/features/ecommerce/refunds.js +195 -0
- package/dist/lib/features/ecommerce/refunds.js.map +1 -0
- package/dist/lib/features/ecommerce/search.d.ts +1 -24
- package/dist/lib/features/ecommerce/search.js +156 -0
- package/dist/lib/features/ecommerce/search.js.map +1 -0
- package/dist/lib/features/ecommerce/subscriptions.d.ts +1 -28
- package/dist/lib/features/ecommerce/subscriptions.js +207 -0
- package/dist/lib/features/ecommerce/subscriptions.js.map +1 -0
- package/dist/lib/features/ecommerce/wishlist.d.ts +1 -28
- package/dist/lib/features/ecommerce/wishlist.js +186 -0
- package/dist/lib/features/ecommerce/wishlist.js.map +1 -0
- package/dist/lib/features/enterprise/acquisition.d.ts +2 -57
- package/dist/lib/features/enterprise/acquisition.js +166 -0
- package/dist/lib/features/enterprise/acquisition.js.map +1 -0
- package/dist/lib/features/enterprise/alerts.d.ts +1 -37
- package/dist/lib/features/enterprise/alerts.js +246 -0
- package/dist/lib/features/enterprise/alerts.js.map +1 -0
- package/dist/lib/features/enterprise/churn.d.ts +1 -42
- package/dist/lib/features/enterprise/churn.js +175 -0
- package/dist/lib/features/enterprise/churn.js.map +1 -0
- package/dist/lib/features/enterprise/cohorts.d.ts +1 -37
- package/dist/lib/features/enterprise/cohorts.js +201 -0
- package/dist/lib/features/enterprise/cohorts.js.map +1 -0
- package/dist/lib/features/enterprise/engagement.d.ts +40 -46
- package/dist/lib/features/enterprise/engagement.js +335 -0
- package/dist/lib/features/enterprise/engagement.js.map +1 -0
- package/dist/lib/features/enterprise/forecasting.d.ts +0 -50
- package/dist/lib/features/enterprise/forecasting.js +232 -0
- package/dist/lib/features/enterprise/forecasting.js.map +1 -0
- package/dist/lib/features/enterprise/index.d.ts +1 -1
- package/dist/lib/features/enterprise/index.js +76 -0
- package/dist/lib/features/enterprise/index.js.map +1 -0
- package/dist/lib/features/enterprise/monetization.d.ts +1 -60
- package/dist/lib/features/enterprise/monetization.js +146 -0
- package/dist/lib/features/enterprise/monetization.js.map +1 -0
- package/dist/lib/features/enterprise/multi-path-funnels.d.ts +1 -17
- package/dist/lib/features/enterprise/multi-path-funnels.js +205 -0
- package/dist/lib/features/enterprise/multi-path-funnels.js.map +1 -0
- package/dist/lib/features/enterprise/paths.d.ts +1 -56
- package/dist/lib/features/enterprise/paths.js +149 -0
- package/dist/lib/features/enterprise/paths.js.map +1 -0
- package/dist/lib/features/enterprise/security.d.ts +8 -57
- package/dist/lib/features/enterprise/security.js +202 -0
- package/dist/lib/features/enterprise/security.js.map +1 -0
- package/dist/lib/features/enterprise/support.d.ts +3 -42
- package/dist/lib/features/enterprise/support.js +162 -0
- package/dist/lib/features/enterprise/support.js.map +1 -0
- package/dist/lib/flowgrid.d.ts +278 -0
- package/dist/lib/flowgrid.js +323 -0
- package/dist/lib/flowgrid.js.map +1 -0
- package/dist/lib/frameworks/index.d.ts +13 -6
- package/dist/lib/frameworks/index.js +18 -0
- package/dist/lib/frameworks/index.js.map +1 -0
- package/dist/lib/frameworks/nextjs/client.js +355 -0
- package/dist/lib/frameworks/nextjs/client.js.map +1 -0
- package/dist/lib/frameworks/nextjs/index.js +31 -0
- package/dist/lib/frameworks/nextjs/index.js.map +1 -0
- package/dist/lib/frameworks/nextjs/server.js +259 -0
- package/dist/lib/frameworks/nextjs/server.js.map +1 -0
- package/dist/lib/frameworks/node/index.js +391 -0
- package/dist/lib/frameworks/node/index.js.map +1 -0
- package/dist/lib/frameworks/nuxt/index.js +288 -0
- package/dist/lib/frameworks/nuxt/index.js.map +1 -0
- package/dist/lib/frameworks/react/CookieBanner.js +166 -0
- package/dist/lib/frameworks/react/CookieBanner.js.map +1 -0
- package/dist/lib/frameworks/react/index.d.ts +2 -2
- package/dist/lib/frameworks/react/index.js +271 -0
- package/dist/lib/frameworks/react/index.js.map +1 -0
- package/dist/lib/frameworks/vue/CookieBanner.js +165 -0
- package/dist/lib/frameworks/vue/CookieBanner.js.map +1 -0
- package/dist/lib/frameworks/vue/index.d.ts +2 -2
- package/dist/lib/frameworks/vue/index.js +390 -0
- package/dist/lib/frameworks/vue/index.js.map +1 -0
- package/dist/lib/tracking/analytics/attribution.d.ts +14 -0
- package/dist/lib/tracking/analytics/attribution.js +18 -0
- package/dist/lib/tracking/analytics/attribution.js.map +1 -0
- package/dist/lib/tracking/analytics/events.d.ts +26 -0
- package/dist/lib/tracking/analytics/events.js +30 -0
- package/dist/lib/tracking/analytics/events.js.map +1 -0
- package/dist/lib/tracking/analytics/funnels.d.ts +16 -0
- package/dist/lib/tracking/analytics/funnels.js +22 -0
- package/dist/lib/tracking/analytics/funnels.js.map +1 -0
- package/dist/lib/tracking/analytics/heatmaps.d.ts +27 -0
- package/dist/lib/tracking/analytics/heatmaps.js +22 -0
- package/dist/lib/tracking/analytics/heatmaps.js.map +1 -0
- package/dist/lib/tracking/analytics/identify.d.ts +16 -0
- package/dist/lib/tracking/analytics/identify.js +22 -0
- package/dist/lib/tracking/analytics/identify.js.map +1 -0
- package/dist/lib/tracking/analytics/index.d.ts +10 -0
- package/dist/lib/tracking/analytics/index.js +11 -0
- package/dist/lib/tracking/analytics/index.js.map +1 -0
- package/dist/lib/tracking/analytics/page-views.d.ts +29 -0
- package/dist/lib/tracking/analytics/page-views.js +50 -0
- package/dist/lib/tracking/analytics/page-views.js.map +1 -0
- package/dist/lib/tracking/analytics/performance.d.ts +22 -0
- package/dist/lib/tracking/analytics/performance.js +22 -0
- package/dist/lib/tracking/analytics/performance.js.map +1 -0
- package/dist/lib/tracking/analytics/replay.d.ts +34 -0
- package/dist/lib/tracking/analytics/replay.js +46 -0
- package/dist/lib/tracking/analytics/replay.js.map +1 -0
- package/dist/lib/tracking/analytics/retention.d.ts +10 -0
- package/dist/lib/tracking/analytics/retention.js +10 -0
- package/dist/lib/tracking/analytics/retention.js.map +1 -0
- package/dist/lib/tracking/analytics/sessions.d.ts +20 -0
- package/dist/lib/tracking/analytics/sessions.js +26 -0
- package/dist/lib/tracking/analytics/sessions.js.map +1 -0
- package/dist/lib/tracking/core/activation.d.ts +23 -0
- package/dist/lib/tracking/core/activation.js +33 -0
- package/dist/lib/tracking/core/activation.js.map +1 -0
- package/dist/lib/tracking/core/experiment.d.ts +122 -0
- package/dist/lib/tracking/core/experiment.js +150 -0
- package/dist/lib/tracking/core/experiment.js.map +1 -0
- package/dist/lib/tracking/core/feature.d.ts +13 -0
- package/dist/lib/tracking/core/feature.js +14 -0
- package/dist/lib/tracking/core/feature.js.map +1 -0
- package/dist/lib/tracking/core/index.d.ts +4 -0
- package/dist/lib/tracking/core/index.js +5 -0
- package/dist/lib/tracking/core/index.js.map +1 -0
- package/dist/lib/tracking/core/prompt.d.ts +18 -0
- package/dist/lib/tracking/core/prompt.js +26 -0
- package/dist/lib/tracking/core/prompt.js.map +1 -0
- package/dist/lib/tracking/ecommerce/cart.d.ts +17 -0
- package/dist/lib/tracking/ecommerce/cart.js +22 -0
- package/dist/lib/tracking/ecommerce/cart.js.map +1 -0
- package/dist/lib/tracking/ecommerce/checkout.d.ts +17 -0
- package/dist/lib/tracking/ecommerce/checkout.js +22 -0
- package/dist/lib/tracking/ecommerce/checkout.js.map +1 -0
- package/dist/lib/tracking/ecommerce/index.d.ts +10 -0
- package/dist/lib/tracking/ecommerce/index.js +11 -0
- package/dist/lib/tracking/ecommerce/index.js.map +1 -0
- package/dist/lib/tracking/ecommerce/ltv.d.ts +15 -0
- package/dist/lib/tracking/ecommerce/ltv.js +14 -0
- package/dist/lib/tracking/ecommerce/ltv.js.map +1 -0
- package/dist/lib/tracking/ecommerce/products.d.ts +15 -0
- package/dist/lib/tracking/ecommerce/products.js +18 -0
- package/dist/lib/tracking/ecommerce/products.js.map +1 -0
- package/dist/lib/tracking/ecommerce/promotions.d.ts +14 -0
- package/dist/lib/tracking/ecommerce/promotions.js +25 -0
- package/dist/lib/tracking/ecommerce/promotions.js.map +1 -0
- package/dist/lib/tracking/ecommerce/purchases.d.ts +11 -0
- package/dist/lib/tracking/ecommerce/purchases.js +10 -0
- package/dist/lib/tracking/ecommerce/purchases.js.map +1 -0
- package/dist/lib/tracking/ecommerce/refunds.d.ts +17 -0
- package/dist/lib/tracking/ecommerce/refunds.js +22 -0
- package/dist/lib/tracking/ecommerce/refunds.js.map +1 -0
- package/dist/lib/tracking/ecommerce/search.d.ts +24 -0
- package/dist/lib/tracking/ecommerce/search.js +22 -0
- package/dist/lib/tracking/ecommerce/search.js.map +1 -0
- package/dist/lib/tracking/ecommerce/subscriptions.d.ts +21 -0
- package/dist/lib/tracking/ecommerce/subscriptions.js +38 -0
- package/dist/lib/tracking/ecommerce/subscriptions.js.map +1 -0
- package/dist/lib/tracking/ecommerce/wishlist.d.ts +19 -0
- package/dist/lib/tracking/ecommerce/wishlist.js +26 -0
- package/dist/lib/tracking/ecommerce/wishlist.js.map +1 -0
- package/dist/lib/tracking/enterprise/acquisition.d.ts +25 -0
- package/dist/lib/tracking/enterprise/acquisition.js +22 -0
- package/dist/lib/tracking/enterprise/acquisition.js.map +1 -0
- package/dist/lib/tracking/enterprise/alerts.d.ts +32 -0
- package/dist/lib/tracking/enterprise/alerts.js +30 -0
- package/dist/lib/tracking/enterprise/alerts.js.map +1 -0
- package/dist/lib/tracking/enterprise/churn.d.ts +23 -0
- package/dist/lib/tracking/enterprise/churn.js +22 -0
- package/dist/lib/tracking/enterprise/churn.js.map +1 -0
- package/dist/lib/tracking/enterprise/cohorts.d.ts +18 -0
- package/dist/lib/tracking/enterprise/cohorts.js +18 -0
- package/dist/lib/tracking/enterprise/cohorts.js.map +1 -0
- package/dist/lib/tracking/enterprise/engagement.d.ts +31 -0
- package/dist/lib/tracking/enterprise/engagement.js +44 -0
- package/dist/lib/tracking/enterprise/engagement.js.map +1 -0
- package/dist/lib/tracking/enterprise/forecasting.d.ts +18 -0
- package/dist/lib/tracking/enterprise/forecasting.js +22 -0
- package/dist/lib/tracking/enterprise/forecasting.js.map +1 -0
- package/dist/lib/tracking/enterprise/index.d.ts +11 -0
- package/dist/lib/tracking/enterprise/index.js +12 -0
- package/dist/lib/tracking/enterprise/index.js.map +1 -0
- package/dist/lib/tracking/enterprise/monetization.d.ts +14 -0
- package/dist/lib/tracking/enterprise/monetization.js +10 -0
- package/dist/lib/tracking/enterprise/monetization.js.map +1 -0
- package/dist/lib/tracking/enterprise/multi-path-funnels.d.ts +20 -0
- package/dist/lib/tracking/enterprise/multi-path-funnels.js +18 -0
- package/dist/lib/tracking/enterprise/multi-path-funnels.js.map +1 -0
- package/dist/lib/tracking/enterprise/paths.d.ts +20 -0
- package/dist/lib/tracking/enterprise/paths.js +18 -0
- package/dist/lib/tracking/enterprise/paths.js.map +1 -0
- package/dist/lib/tracking/enterprise/security.d.ts +28 -0
- package/dist/lib/tracking/enterprise/security.js +26 -0
- package/dist/lib/tracking/enterprise/security.js.map +1 -0
- package/dist/lib/tracking/enterprise/support.d.ts +25 -0
- package/dist/lib/tracking/enterprise/support.js +22 -0
- package/dist/lib/tracking/enterprise/support.js.map +1 -0
- package/dist/lib/tracking/index.d.ts +4 -0
- package/dist/lib/tracking/index.js +5 -0
- package/dist/lib/tracking/index.js.map +1 -0
- package/dist/lib/types/analytics.d.ts +10 -2
- package/dist/lib/types/analytics.js +6 -0
- package/dist/lib/types/analytics.js.map +1 -0
- package/dist/lib/types/common.js +6 -0
- package/dist/lib/types/common.js.map +1 -0
- package/dist/lib/types/ecommerce.js +6 -0
- package/dist/lib/types/ecommerce.js.map +1 -0
- package/dist/lib/types/index.js +8 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/utils/browser.d.ts +16 -0
- package/dist/lib/utils/browser.js +32 -0
- package/dist/lib/utils/browser.js.map +1 -0
- package/dist/lib/utils/identity.js +346 -0
- package/dist/lib/utils/identity.js.map +1 -0
- package/dist/lib/utils/storage.js +105 -0
- package/dist/lib/utils/storage.js.map +1 -0
- package/dist/umd/237.index.js +2 -0
- package/dist/umd/237.index.js.map +1 -0
- package/dist/umd/546.index.js +3 -0
- package/dist/umd/546.index.js.LICENSE.txt +14 -0
- package/dist/umd/546.index.js.map +1 -0
- package/dist/umd/index.js +2 -0
- package/dist/umd/index.js.map +1 -0
- package/package.json +27 -80
- 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":"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"}
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
42
|
import { FlowGridTransport } from "../../client/transport";
|
|
43
|
-
import {
|
|
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
|
-
*
|
|
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
|
|
258
|
-
* @
|
|
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
|
-
* ```
|
|
262
|
-
* const
|
|
263
|
-
*
|
|
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
|
-
|
|
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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"}
|