kanmi-perf-revenue 1.0.0 → 1.2.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 +347 -173
- package/dist/empirical/ab-testing.d.ts +83 -0
- package/dist/empirical/ab-testing.d.ts.map +1 -0
- package/dist/empirical/ab-testing.js +281 -0
- package/dist/empirical/ab-testing.js.map +1 -0
- package/dist/empirical/alerting.d.ts +85 -0
- package/dist/empirical/alerting.d.ts.map +1 -0
- package/dist/empirical/alerting.js +358 -0
- package/dist/empirical/alerting.js.map +1 -0
- package/dist/empirical/attribution.d.ts +80 -0
- package/dist/empirical/attribution.d.ts.map +1 -0
- package/dist/empirical/attribution.js +305 -0
- package/dist/empirical/attribution.js.map +1 -0
- package/dist/empirical/cohort.d.ts +75 -0
- package/dist/empirical/cohort.d.ts.map +1 -0
- package/dist/empirical/cohort.js +305 -0
- package/dist/empirical/cohort.js.map +1 -0
- package/dist/empirical/conversion-curve.d.ts +7 -10
- package/dist/empirical/conversion-curve.d.ts.map +1 -1
- package/dist/empirical/conversion-curve.js +37 -4
- package/dist/empirical/conversion-curve.js.map +1 -1
- package/dist/empirical/correlation.d.ts +91 -0
- package/dist/empirical/correlation.d.ts.map +1 -0
- package/dist/empirical/correlation.js +461 -0
- package/dist/empirical/correlation.js.map +1 -0
- package/dist/empirical/data-import.d.ts +22 -0
- package/dist/empirical/data-import.d.ts.map +1 -1
- package/dist/empirical/data-import.js +44 -0
- package/dist/empirical/data-import.js.map +1 -1
- package/dist/empirical/datadog-product-analytics.d.ts +192 -0
- package/dist/empirical/datadog-product-analytics.d.ts.map +1 -0
- package/dist/empirical/datadog-product-analytics.js +632 -0
- package/dist/empirical/datadog-product-analytics.js.map +1 -0
- package/dist/empirical/datadog-session-query.d.ts +32 -0
- package/dist/empirical/datadog-session-query.d.ts.map +1 -1
- package/dist/empirical/datadog-session-query.js +238 -17
- package/dist/empirical/datadog-session-query.js.map +1 -1
- package/dist/empirical/engagement-analysis.d.ts +112 -0
- package/dist/empirical/engagement-analysis.d.ts.map +1 -0
- package/dist/empirical/engagement-analysis.js +354 -0
- package/dist/empirical/engagement-analysis.js.map +1 -0
- package/dist/empirical/export.d.ts +75 -0
- package/dist/empirical/export.d.ts.map +1 -0
- package/dist/empirical/export.js +392 -0
- package/dist/empirical/export.js.map +1 -0
- package/dist/empirical/forecasting.d.ts +80 -0
- package/dist/empirical/forecasting.d.ts.map +1 -0
- package/dist/empirical/forecasting.js +287 -0
- package/dist/empirical/forecasting.js.map +1 -0
- package/dist/empirical/funnel.d.ts +66 -0
- package/dist/empirical/funnel.d.ts.map +1 -0
- package/dist/empirical/funnel.js +293 -0
- package/dist/empirical/funnel.js.map +1 -0
- package/dist/empirical/history.d.ts +198 -0
- package/dist/empirical/history.d.ts.map +1 -0
- package/dist/empirical/history.js +396 -0
- package/dist/empirical/history.js.map +1 -0
- package/dist/empirical/index.d.ts +41 -16
- package/dist/empirical/index.d.ts.map +1 -1
- package/dist/empirical/index.js +96 -13
- package/dist/empirical/index.js.map +1 -1
- package/dist/empirical/interactions.d.ts +89 -0
- package/dist/empirical/interactions.d.ts.map +1 -0
- package/dist/empirical/interactions.js +346 -0
- package/dist/empirical/interactions.js.map +1 -0
- package/dist/empirical/opportunity-calculator.d.ts +6 -18
- package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
- package/dist/empirical/opportunity-calculator.js +19 -1
- package/dist/empirical/opportunity-calculator.js.map +1 -1
- package/dist/empirical/report.d.ts +3 -11
- package/dist/empirical/report.d.ts.map +1 -1
- package/dist/empirical/report.js +11 -7
- package/dist/empirical/report.js.map +1 -1
- package/dist/empirical/roi-calculator.d.ts +104 -0
- package/dist/empirical/roi-calculator.d.ts.map +1 -0
- package/dist/empirical/roi-calculator.js +403 -0
- package/dist/empirical/roi-calculator.js.map +1 -0
- package/dist/empirical/seasonality.d.ts +80 -0
- package/dist/empirical/seasonality.d.ts.map +1 -0
- package/dist/empirical/seasonality.js +340 -0
- package/dist/empirical/seasonality.js.map +1 -0
- package/dist/empirical/segmentation.d.ts +135 -0
- package/dist/empirical/segmentation.d.ts.map +1 -0
- package/dist/empirical/segmentation.js +379 -0
- package/dist/empirical/segmentation.js.map +1 -0
- package/dist/empirical/statistics.d.ts +118 -0
- package/dist/empirical/statistics.d.ts.map +1 -0
- package/dist/empirical/statistics.js +344 -0
- package/dist/empirical/statistics.js.map +1 -0
- package/dist/empirical/sweet-spot.d.ts +81 -0
- package/dist/empirical/sweet-spot.d.ts.map +1 -0
- package/dist/empirical/sweet-spot.js +198 -0
- package/dist/empirical/sweet-spot.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engagement Analysis
|
|
3
|
+
*
|
|
4
|
+
* Analyzes the relationship between performance and user engagement.
|
|
5
|
+
* Key metrics: bounce rate, page views per session, session duration.
|
|
6
|
+
*
|
|
7
|
+
* This complements conversion analysis by showing HOW performance
|
|
8
|
+
* affects user behavior before conversion decisions.
|
|
9
|
+
*
|
|
10
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
11
|
+
*/
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// ENGAGEMENT CURVE BUILDER
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Build an engagement curve showing bounce rate by performance bucket.
|
|
17
|
+
*/
|
|
18
|
+
export function buildEngagementCurve(sessions, metric, config = {}) {
|
|
19
|
+
const { minSessions = 50 } = config;
|
|
20
|
+
const getValue = getMetricExtractor(metric);
|
|
21
|
+
const validSessions = sessions.filter((s) => getValue(s) !== null);
|
|
22
|
+
const boundaries = config.bucketBoundaries || getDefaultBoundaries(metric);
|
|
23
|
+
// Initialize buckets
|
|
24
|
+
const bucketMap = new Map();
|
|
25
|
+
for (const boundary of boundaries) {
|
|
26
|
+
bucketMap.set(boundary, []);
|
|
27
|
+
}
|
|
28
|
+
bucketMap.set(Infinity, []);
|
|
29
|
+
// Assign sessions to buckets
|
|
30
|
+
for (const session of validSessions) {
|
|
31
|
+
const value = getValue(session);
|
|
32
|
+
const bucket = findBucket(value, boundaries);
|
|
33
|
+
bucketMap.get(bucket).push(session);
|
|
34
|
+
}
|
|
35
|
+
// Calculate stats for each bucket
|
|
36
|
+
const buckets = [];
|
|
37
|
+
const sortedBoundaries = [...boundaries, Infinity].sort((a, b) => a - b);
|
|
38
|
+
let prevBoundary = 0;
|
|
39
|
+
for (const boundary of sortedBoundaries) {
|
|
40
|
+
const bucketSessions = bucketMap.get(boundary) || [];
|
|
41
|
+
if (bucketSessions.length === 0) {
|
|
42
|
+
prevBoundary = boundary;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const bounces = bucketSessions.filter((s) => s.bounced).length;
|
|
46
|
+
const bounceRate = bucketSessions.length > 0 ? bounces / bucketSessions.length : 0;
|
|
47
|
+
const totalPageViews = bucketSessions.reduce((sum, s) => sum + s.page_views, 0);
|
|
48
|
+
const avgPageViews = bucketSessions.length > 0 ? totalPageViews / bucketSessions.length : 0;
|
|
49
|
+
const totalDuration = bucketSessions.reduce((sum, s) => sum + (s.session_duration_ms || 0), 0);
|
|
50
|
+
const avgDuration = bucketSessions.length > 0 ? totalDuration / bucketSessions.length : 0;
|
|
51
|
+
let confidence = 'low';
|
|
52
|
+
if (bucketSessions.length >= 100) {
|
|
53
|
+
confidence = 'high';
|
|
54
|
+
}
|
|
55
|
+
else if (bucketSessions.length >= minSessions) {
|
|
56
|
+
confidence = 'medium';
|
|
57
|
+
}
|
|
58
|
+
buckets.push({
|
|
59
|
+
range: formatRange(prevBoundary, boundary, metric),
|
|
60
|
+
lower_ms: prevBoundary,
|
|
61
|
+
upper_ms: boundary,
|
|
62
|
+
sessions: bucketSessions.length,
|
|
63
|
+
bounces,
|
|
64
|
+
bounce_rate: bounceRate,
|
|
65
|
+
avg_page_views: avgPageViews,
|
|
66
|
+
avg_session_duration_ms: avgDuration,
|
|
67
|
+
confidence,
|
|
68
|
+
});
|
|
69
|
+
prevBoundary = boundary;
|
|
70
|
+
}
|
|
71
|
+
// Calculate summary
|
|
72
|
+
const totalSessions = validSessions.length;
|
|
73
|
+
const totalBounces = validSessions.filter((s) => s.bounced).length;
|
|
74
|
+
const overallBounceRate = totalSessions > 0 ? totalBounces / totalSessions : 0;
|
|
75
|
+
const totalPageViews = validSessions.reduce((sum, s) => sum + s.page_views, 0);
|
|
76
|
+
const avgPageViews = totalSessions > 0 ? totalPageViews / totalSessions : 0;
|
|
77
|
+
const totalDuration = validSessions.reduce((sum, s) => sum + (s.session_duration_ms || 0), 0);
|
|
78
|
+
const avgDuration = totalSessions > 0 ? totalDuration / totalSessions : 0;
|
|
79
|
+
const fastestBucket = buckets[0];
|
|
80
|
+
const slowestBucket = buckets[buckets.length - 1];
|
|
81
|
+
const bounceRateRange = fastestBucket && slowestBucket
|
|
82
|
+
? slowestBucket.bounce_rate - fastestBucket.bounce_rate
|
|
83
|
+
: 0;
|
|
84
|
+
const relativeBounceIncrease = fastestBucket?.bounce_rate > 0
|
|
85
|
+
? bounceRateRange / fastestBucket.bounce_rate
|
|
86
|
+
: 0;
|
|
87
|
+
return {
|
|
88
|
+
metric,
|
|
89
|
+
buckets,
|
|
90
|
+
summary: {
|
|
91
|
+
total_sessions: totalSessions,
|
|
92
|
+
total_bounces: totalBounces,
|
|
93
|
+
overall_bounce_rate: overallBounceRate,
|
|
94
|
+
avg_page_views: avgPageViews,
|
|
95
|
+
avg_session_duration_ms: avgDuration,
|
|
96
|
+
bounce_rate_range: bounceRateRange,
|
|
97
|
+
relative_bounce_increase: relativeBounceIncrease,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Build engagement curves for all performance metrics.
|
|
103
|
+
*/
|
|
104
|
+
export function buildAllEngagementCurves(sessions, config = {}) {
|
|
105
|
+
return {
|
|
106
|
+
lcp: buildEngagementCurve(sessions, 'lcp', config),
|
|
107
|
+
fcp: buildEngagementCurve(sessions, 'fcp', config),
|
|
108
|
+
inp: buildEngagementCurve(sessions, 'inp', config),
|
|
109
|
+
cls: buildEngagementCurve(sessions, 'cls', config),
|
|
110
|
+
ttfb: buildEngagementCurve(sessions, 'ttfb', config),
|
|
111
|
+
tti: buildEngagementCurve(sessions, 'tti', config),
|
|
112
|
+
onload: buildEngagementCurve(sessions, 'onload', config),
|
|
113
|
+
page_size: buildEngagementCurve(sessions, 'page_size', config),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// =============================================================================
|
|
117
|
+
// ENGAGEMENT OPPORTUNITY CALCULATOR
|
|
118
|
+
// =============================================================================
|
|
119
|
+
/**
|
|
120
|
+
* Calculate engagement opportunities for a single metric.
|
|
121
|
+
*/
|
|
122
|
+
export function calculateEngagementOpportunity(curve, targetMs) {
|
|
123
|
+
// Partition buckets into fast and slow
|
|
124
|
+
const fastBuckets = curve.buckets.filter((b) => b.upper_ms <= targetMs);
|
|
125
|
+
const slowBuckets = curve.buckets.filter((b) => b.lower_ms >= targetMs);
|
|
126
|
+
const fastSessions = fastBuckets.reduce((sum, b) => sum + b.sessions, 0);
|
|
127
|
+
const slowSessions = slowBuckets.reduce((sum, b) => sum + b.sessions, 0);
|
|
128
|
+
if (fastSessions < 50 || slowSessions < 50) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const fastBounces = fastBuckets.reduce((sum, b) => sum + b.bounces, 0);
|
|
132
|
+
const slowBounces = slowBuckets.reduce((sum, b) => sum + b.bounces, 0);
|
|
133
|
+
const fastBounceRate = fastBounces / fastSessions;
|
|
134
|
+
const slowBounceRate = slowBounces / slowSessions;
|
|
135
|
+
const bounceRateDelta = slowBounceRate - fastBounceRate;
|
|
136
|
+
if (bounceRateDelta <= 0) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const potentialBouncesPrevented = Math.round(slowSessions * bounceRateDelta);
|
|
140
|
+
let confidence = 'low';
|
|
141
|
+
const minSessions = Math.min(fastSessions, slowSessions);
|
|
142
|
+
if (minSessions >= 100) {
|
|
143
|
+
confidence = 'high';
|
|
144
|
+
}
|
|
145
|
+
else if (minSessions >= 50) {
|
|
146
|
+
confidence = 'medium';
|
|
147
|
+
}
|
|
148
|
+
const metricLabel = curve.metric.toUpperCase();
|
|
149
|
+
const targetLabel = formatTargetLabel(targetMs, curve.metric);
|
|
150
|
+
const slowPct = ((slowSessions / curve.summary.total_sessions) * 100).toFixed(0);
|
|
151
|
+
const bounceIncreasePct = ((bounceRateDelta / fastBounceRate) * 100).toFixed(0);
|
|
152
|
+
return {
|
|
153
|
+
metric: curve.metric,
|
|
154
|
+
target_ms: targetMs,
|
|
155
|
+
slow_sessions: slowSessions,
|
|
156
|
+
slow_bounce_rate: slowBounceRate,
|
|
157
|
+
fast_bounce_rate: fastBounceRate,
|
|
158
|
+
bounce_rate_delta: bounceRateDelta,
|
|
159
|
+
potential_bounces_prevented: potentialBouncesPrevented,
|
|
160
|
+
confidence,
|
|
161
|
+
insight: `${slowPct}% of sessions have ${metricLabel} > ${targetLabel}. These sessions bounce ${bounceIncreasePct}% more often. Improving could prevent ~${potentialBouncesPrevented.toLocaleString()} bounces.`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate a full engagement report.
|
|
166
|
+
*/
|
|
167
|
+
export function generateEngagementReport(sessions, config = {}) {
|
|
168
|
+
const curves = buildAllEngagementCurves(sessions, config);
|
|
169
|
+
// Calculate opportunities for each metric at standard thresholds
|
|
170
|
+
const opportunities = [];
|
|
171
|
+
const targets = {
|
|
172
|
+
lcp: [2500, 4000],
|
|
173
|
+
fcp: [1800, 3000],
|
|
174
|
+
inp: [200, 500],
|
|
175
|
+
cls: [100, 250],
|
|
176
|
+
ttfb: [800, 1800],
|
|
177
|
+
tti: [3800, 7300],
|
|
178
|
+
onload: [3000, 6000],
|
|
179
|
+
page_size: [3000, 6000],
|
|
180
|
+
};
|
|
181
|
+
for (const [metric, thresholds] of Object.entries(targets)) {
|
|
182
|
+
for (const target of thresholds) {
|
|
183
|
+
const opportunity = calculateEngagementOpportunity(curves[metric], target);
|
|
184
|
+
if (opportunity && opportunity.confidence !== 'low') {
|
|
185
|
+
opportunities.push(opportunity);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Sort by potential impact
|
|
190
|
+
opportunities.sort((a, b) => b.potential_bounces_prevented - a.potential_bounces_prevented);
|
|
191
|
+
// Find primary driver
|
|
192
|
+
let primaryDriver = null;
|
|
193
|
+
let primaryImpact = '';
|
|
194
|
+
if (opportunities.length > 0) {
|
|
195
|
+
const top = opportunities[0];
|
|
196
|
+
primaryDriver = top.metric;
|
|
197
|
+
primaryImpact = top.insight;
|
|
198
|
+
}
|
|
199
|
+
// Overall summary
|
|
200
|
+
const totalSessions = sessions.length;
|
|
201
|
+
const totalBounces = sessions.filter((s) => s.bounced).length;
|
|
202
|
+
const overallBounceRate = totalSessions > 0 ? totalBounces / totalSessions : 0;
|
|
203
|
+
const totalPageViews = sessions.reduce((sum, s) => sum + s.page_views, 0);
|
|
204
|
+
const avgPageViews = totalSessions > 0 ? totalPageViews / totalSessions : 0;
|
|
205
|
+
return {
|
|
206
|
+
curves,
|
|
207
|
+
opportunities,
|
|
208
|
+
summary: {
|
|
209
|
+
total_sessions: totalSessions,
|
|
210
|
+
overall_bounce_rate: overallBounceRate,
|
|
211
|
+
avg_page_views: avgPageViews,
|
|
212
|
+
primary_driver: primaryDriver,
|
|
213
|
+
primary_driver_impact: primaryImpact,
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Generate a markdown report of engagement analysis.
|
|
219
|
+
*/
|
|
220
|
+
export function generateEngagementMarkdownReport(report) {
|
|
221
|
+
const lines = [];
|
|
222
|
+
lines.push('# Engagement Analysis Report');
|
|
223
|
+
lines.push('');
|
|
224
|
+
lines.push('> Analyzing how performance affects user engagement: bounce rate, page views, and session duration.');
|
|
225
|
+
lines.push('');
|
|
226
|
+
// Summary
|
|
227
|
+
lines.push('## Summary');
|
|
228
|
+
lines.push('');
|
|
229
|
+
lines.push(`- **Total Sessions:** ${report.summary.total_sessions.toLocaleString()}`);
|
|
230
|
+
lines.push(`- **Overall Bounce Rate:** ${(report.summary.overall_bounce_rate * 100).toFixed(1)}%`);
|
|
231
|
+
lines.push(`- **Average Page Views:** ${report.summary.avg_page_views.toFixed(1)}`);
|
|
232
|
+
lines.push('');
|
|
233
|
+
if (report.summary.primary_driver) {
|
|
234
|
+
lines.push('### Primary Performance Driver');
|
|
235
|
+
lines.push('');
|
|
236
|
+
lines.push(`**${report.summary.primary_driver.toUpperCase()}** has the largest impact on engagement.`);
|
|
237
|
+
lines.push('');
|
|
238
|
+
lines.push(report.summary.primary_driver_impact);
|
|
239
|
+
lines.push('');
|
|
240
|
+
}
|
|
241
|
+
// Bounce Rate by Metric
|
|
242
|
+
lines.push('## Bounce Rate by Performance');
|
|
243
|
+
lines.push('');
|
|
244
|
+
for (const [metric, curve] of Object.entries(report.curves)) {
|
|
245
|
+
if (curve.buckets.length === 0)
|
|
246
|
+
continue;
|
|
247
|
+
const metricLabel = metric === 'page_size' ? 'Page Size' : metric.toUpperCase();
|
|
248
|
+
lines.push(`### ${metricLabel}`);
|
|
249
|
+
lines.push('');
|
|
250
|
+
lines.push('| Range | Sessions | Bounce Rate | Avg Page Views | Avg Duration |');
|
|
251
|
+
lines.push('|-------|----------|-------------|----------------|--------------|');
|
|
252
|
+
for (const bucket of curve.buckets) {
|
|
253
|
+
const bounceRatePct = (bucket.bounce_rate * 100).toFixed(1);
|
|
254
|
+
const durationMin = (bucket.avg_session_duration_ms / 60000).toFixed(1);
|
|
255
|
+
lines.push(`| ${bucket.range} | ${bucket.sessions.toLocaleString()} | ${bounceRatePct}% | ${bucket.avg_page_views.toFixed(1)} | ${durationMin}m |`);
|
|
256
|
+
}
|
|
257
|
+
if (curve.summary.relative_bounce_increase > 0.1) {
|
|
258
|
+
const increasePct = (curve.summary.relative_bounce_increase * 100).toFixed(0);
|
|
259
|
+
lines.push('');
|
|
260
|
+
lines.push(`**Insight:** Slowest bucket bounces ${increasePct}% more than fastest bucket.`);
|
|
261
|
+
}
|
|
262
|
+
lines.push('');
|
|
263
|
+
}
|
|
264
|
+
// Opportunities
|
|
265
|
+
if (report.opportunities.length > 0) {
|
|
266
|
+
lines.push('## Opportunities to Reduce Bounce Rate');
|
|
267
|
+
lines.push('');
|
|
268
|
+
lines.push('| Metric | Target | Slow Sessions | Bounce Increase | Bounces Prevented |');
|
|
269
|
+
lines.push('|--------|--------|---------------|-----------------|-------------------|');
|
|
270
|
+
for (const opp of report.opportunities.slice(0, 5)) {
|
|
271
|
+
const targetLabel = formatTargetLabel(opp.target_ms, opp.metric);
|
|
272
|
+
const bounceIncrease = ((opp.bounce_rate_delta / opp.fast_bounce_rate) * 100).toFixed(0);
|
|
273
|
+
lines.push(`| ${opp.metric.toUpperCase()} | ${targetLabel} | ${opp.slow_sessions.toLocaleString()} | +${bounceIncrease}% | ~${opp.potential_bounces_prevented.toLocaleString()} |`);
|
|
274
|
+
}
|
|
275
|
+
lines.push('');
|
|
276
|
+
}
|
|
277
|
+
lines.push('---');
|
|
278
|
+
lines.push('*Generated by Empirical Performance Revenue Engine*');
|
|
279
|
+
return lines.join('\n');
|
|
280
|
+
}
|
|
281
|
+
// =============================================================================
|
|
282
|
+
// HELPERS
|
|
283
|
+
// =============================================================================
|
|
284
|
+
function getMetricExtractor(metric) {
|
|
285
|
+
switch (metric) {
|
|
286
|
+
case 'lcp':
|
|
287
|
+
return (s) => s.lcp_ms;
|
|
288
|
+
case 'fcp':
|
|
289
|
+
return (s) => s.fcp_ms;
|
|
290
|
+
case 'inp':
|
|
291
|
+
return (s) => s.inp_ms;
|
|
292
|
+
case 'cls':
|
|
293
|
+
return (s) => (s.cls !== null ? s.cls * 1000 : null);
|
|
294
|
+
case 'ttfb':
|
|
295
|
+
return (s) => s.ttfb_ms;
|
|
296
|
+
case 'tti':
|
|
297
|
+
return (s) => s.tti_ms;
|
|
298
|
+
case 'onload':
|
|
299
|
+
return (s) => s.onload_ms;
|
|
300
|
+
case 'page_size':
|
|
301
|
+
return (s) => s.page_size_kb;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function getDefaultBoundaries(metric) {
|
|
305
|
+
switch (metric) {
|
|
306
|
+
case 'lcp':
|
|
307
|
+
return [1000, 1500, 2000, 2500, 3000, 3500, 4000, 5000, 6000];
|
|
308
|
+
case 'fcp':
|
|
309
|
+
return [500, 1000, 1500, 1800, 2200, 2600, 3000, 4000];
|
|
310
|
+
case 'inp':
|
|
311
|
+
return [50, 100, 150, 200, 300, 400, 500, 750];
|
|
312
|
+
case 'cls':
|
|
313
|
+
return [25, 50, 75, 100, 150, 200, 250, 350];
|
|
314
|
+
case 'ttfb':
|
|
315
|
+
return [200, 400, 600, 800, 1000, 1500, 2000, 3000];
|
|
316
|
+
case 'tti':
|
|
317
|
+
return [2000, 3000, 3800, 5000, 6000, 7300, 9000, 12000];
|
|
318
|
+
case 'onload':
|
|
319
|
+
return [1500, 2000, 2500, 3000, 4000, 5000, 6000, 8000];
|
|
320
|
+
case 'page_size':
|
|
321
|
+
return [1000, 2000, 3000, 4000, 5000, 6000, 8000, 10000];
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function findBucket(value, boundaries) {
|
|
325
|
+
for (const boundary of boundaries.sort((a, b) => a - b)) {
|
|
326
|
+
if (value < boundary) {
|
|
327
|
+
return boundary;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return Infinity;
|
|
331
|
+
}
|
|
332
|
+
function formatRange(lower, upper, metric) {
|
|
333
|
+
if (metric === 'cls') {
|
|
334
|
+
const lowerCls = (lower / 1000).toFixed(2);
|
|
335
|
+
const upperCls = upper === Infinity ? '∞' : (upper / 1000).toFixed(2);
|
|
336
|
+
return `${lowerCls}-${upperCls}`;
|
|
337
|
+
}
|
|
338
|
+
const lowerSec = (lower / 1000).toFixed(1);
|
|
339
|
+
const upperSec = upper === Infinity ? '∞' : (upper / 1000).toFixed(1);
|
|
340
|
+
return `${lowerSec}s-${upperSec}s`;
|
|
341
|
+
}
|
|
342
|
+
function formatTargetLabel(targetMs, metric) {
|
|
343
|
+
if (metric === 'cls') {
|
|
344
|
+
return (targetMs / 1000).toFixed(2);
|
|
345
|
+
}
|
|
346
|
+
if (metric === 'page_size') {
|
|
347
|
+
return `${(targetMs / 1000).toFixed(1)}MB`;
|
|
348
|
+
}
|
|
349
|
+
if (targetMs >= 1000) {
|
|
350
|
+
return `${(targetMs / 1000).toFixed(1)}s`;
|
|
351
|
+
}
|
|
352
|
+
return `${targetMs}ms`;
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=engagement-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engagement-analysis.js","sourceRoot":"","sources":["../../src/empirical/engagement-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Formats
|
|
3
|
+
*
|
|
4
|
+
* Export analysis results to various formats:
|
|
5
|
+
* - JSON (machine-readable)
|
|
6
|
+
* - CSV (spreadsheet-compatible)
|
|
7
|
+
* - Slack (formatted message blocks)
|
|
8
|
+
* - Email (HTML email template)
|
|
9
|
+
*
|
|
10
|
+
* @author Kanmi Obasa <i@kanmiobasa.com>
|
|
11
|
+
*/
|
|
12
|
+
import type { AnalysisResult } from './index.js';
|
|
13
|
+
import type { AlertReport } from './alerting.js';
|
|
14
|
+
export interface ExportOptions {
|
|
15
|
+
includeRawData?: boolean;
|
|
16
|
+
format?: 'compact' | 'pretty';
|
|
17
|
+
clientName?: string;
|
|
18
|
+
dateRange?: {
|
|
19
|
+
start: string;
|
|
20
|
+
end: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface SlackBlock {
|
|
24
|
+
type: 'section' | 'header' | 'divider' | 'context';
|
|
25
|
+
text?: {
|
|
26
|
+
type: 'mrkdwn' | 'plain_text';
|
|
27
|
+
text: string;
|
|
28
|
+
};
|
|
29
|
+
fields?: Array<{
|
|
30
|
+
type: 'mrkdwn' | 'plain_text';
|
|
31
|
+
text: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export interface SlackMessage {
|
|
35
|
+
blocks: SlackBlock[];
|
|
36
|
+
text: string;
|
|
37
|
+
}
|
|
38
|
+
export interface EmailTemplate {
|
|
39
|
+
subject: string;
|
|
40
|
+
html: string;
|
|
41
|
+
text: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Export analysis to JSON.
|
|
45
|
+
*/
|
|
46
|
+
export declare function exportToJson(result: AnalysisResult, options?: ExportOptions): string;
|
|
47
|
+
/**
|
|
48
|
+
* Export opportunities to CSV.
|
|
49
|
+
*/
|
|
50
|
+
export declare function exportOpportunitiesToCsv(result: AnalysisResult): string;
|
|
51
|
+
/**
|
|
52
|
+
* Export curve data to CSV.
|
|
53
|
+
*/
|
|
54
|
+
export declare function exportCurvesToCsv(result: AnalysisResult): string;
|
|
55
|
+
/**
|
|
56
|
+
* Format analysis result for Slack.
|
|
57
|
+
*/
|
|
58
|
+
export declare function exportToSlack(result: AnalysisResult, options?: ExportOptions): SlackMessage;
|
|
59
|
+
/**
|
|
60
|
+
* Format alerts for Slack.
|
|
61
|
+
*/
|
|
62
|
+
export declare function exportAlertsToSlack(report: AlertReport): SlackMessage;
|
|
63
|
+
/**
|
|
64
|
+
* Generate email template from analysis.
|
|
65
|
+
*/
|
|
66
|
+
export declare function exportToEmail(result: AnalysisResult, options?: ExportOptions): EmailTemplate;
|
|
67
|
+
/**
|
|
68
|
+
* Generate webhook payload.
|
|
69
|
+
*/
|
|
70
|
+
export declare function exportToWebhook(result: AnalysisResult, options?: ExportOptions): Record<string, unknown>;
|
|
71
|
+
/**
|
|
72
|
+
* Generate webhook payload for alerts.
|
|
73
|
+
*/
|
|
74
|
+
export declare function exportAlertWebhook(report: AlertReport): Record<string, unknown>;
|
|
75
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/empirical/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IACnD,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgCR;AAMD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA6BvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA8BhE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CA+Ed;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAuDrE;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,aAAa,CA4Gf;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa/E"}
|