@v-tilt/browser 1.1.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/all-external-dependencies.js +2 -0
  2. package/dist/all-external-dependencies.js.map +1 -0
  3. package/dist/array.full.js +2 -0
  4. package/dist/array.full.js.map +1 -0
  5. package/dist/array.js +1 -1
  6. package/dist/array.js.map +1 -1
  7. package/dist/array.no-external.js +1 -1
  8. package/dist/array.no-external.js.map +1 -1
  9. package/dist/entrypoints/all-external-dependencies.d.ts +8 -0
  10. package/dist/entrypoints/array.d.ts +1 -0
  11. package/dist/entrypoints/array.full.d.ts +17 -0
  12. package/dist/entrypoints/external-scripts-loader.d.ts +24 -0
  13. package/dist/entrypoints/module.es.d.ts +1 -0
  14. package/dist/entrypoints/recorder.d.ts +23 -0
  15. package/dist/entrypoints/web-vitals.d.ts +14 -0
  16. package/dist/extensions/replay/index.d.ts +13 -0
  17. package/dist/extensions/replay/session-recording-utils.d.ts +92 -0
  18. package/dist/extensions/replay/session-recording-wrapper.d.ts +61 -0
  19. package/dist/extensions/replay/session-recording.d.ts +95 -0
  20. package/dist/extensions/replay/types.d.ts +211 -0
  21. package/dist/external-scripts-loader.js +2 -0
  22. package/dist/external-scripts-loader.js.map +1 -0
  23. package/dist/main.js +1 -1
  24. package/dist/main.js.map +1 -1
  25. package/dist/module.d.ts +297 -8
  26. package/dist/module.js +1 -1
  27. package/dist/module.js.map +1 -1
  28. package/dist/module.no-external.d.ts +297 -8
  29. package/dist/module.no-external.js +1 -1
  30. package/dist/module.no-external.js.map +1 -1
  31. package/dist/recorder.js +2 -0
  32. package/dist/recorder.js.map +1 -0
  33. package/dist/types.d.ts +116 -6
  34. package/dist/utils/globals.d.ts +69 -0
  35. package/dist/vtilt.d.ts +36 -0
  36. package/dist/web-vitals.d.ts +89 -5
  37. package/dist/web-vitals.js +2 -0
  38. package/dist/web-vitals.js.map +1 -0
  39. package/lib/config.js +7 -3
  40. package/lib/entrypoints/all-external-dependencies.d.ts +8 -0
  41. package/lib/entrypoints/all-external-dependencies.js +10 -0
  42. package/lib/entrypoints/array.d.ts +1 -0
  43. package/lib/entrypoints/array.full.d.ts +17 -0
  44. package/lib/entrypoints/array.full.js +19 -0
  45. package/lib/entrypoints/array.js +1 -0
  46. package/lib/entrypoints/external-scripts-loader.d.ts +24 -0
  47. package/lib/entrypoints/external-scripts-loader.js +107 -0
  48. package/lib/entrypoints/module.es.d.ts +1 -0
  49. package/lib/entrypoints/module.es.js +1 -0
  50. package/lib/entrypoints/recorder.d.ts +23 -0
  51. package/lib/entrypoints/recorder.js +42 -0
  52. package/lib/entrypoints/web-vitals.d.ts +14 -0
  53. package/lib/entrypoints/web-vitals.js +29 -0
  54. package/lib/extensions/replay/index.d.ts +13 -0
  55. package/lib/extensions/replay/index.js +31 -0
  56. package/lib/extensions/replay/session-recording-utils.d.ts +92 -0
  57. package/lib/extensions/replay/session-recording-utils.js +212 -0
  58. package/lib/extensions/replay/session-recording-wrapper.d.ts +61 -0
  59. package/lib/extensions/replay/session-recording-wrapper.js +149 -0
  60. package/lib/extensions/replay/session-recording.d.ts +95 -0
  61. package/lib/extensions/replay/session-recording.js +700 -0
  62. package/lib/extensions/replay/types.d.ts +211 -0
  63. package/lib/extensions/replay/types.js +8 -0
  64. package/lib/types.d.ts +116 -6
  65. package/lib/types.js +16 -0
  66. package/lib/utils/globals.d.ts +69 -0
  67. package/lib/utils/globals.js +2 -0
  68. package/lib/vtilt.d.ts +36 -0
  69. package/lib/vtilt.js +106 -0
  70. package/lib/web-vitals.d.ts +89 -5
  71. package/lib/web-vitals.js +354 -46
  72. package/package.json +4 -1
package/dist/module.d.ts CHANGED
@@ -20,6 +20,13 @@ interface VTiltConfig {
20
20
  api_host?: string;
21
21
  /** UI host for dashboard links */
22
22
  ui_host?: string | null;
23
+ /**
24
+ * Host for loading extension scripts (recorder.js, etc.)
25
+ * Defaults to unpkg CDN: https://unpkg.com/@v-tilt/browser@{version}/dist
26
+ * Can also use jsdelivr: https://cdn.jsdelivr.net/npm/@v-tilt/browser@{version}/dist
27
+ * Or self-hosted: https://your-domain.com/static
28
+ */
29
+ script_host?: string;
23
30
  /** Proxy domain for tracking requests */
24
31
  proxy?: string;
25
32
  /** Full proxy URL for tracking requests */
@@ -52,8 +59,11 @@ interface VTiltConfig {
52
59
  person_profiles?: PersonProfilesMode;
53
60
  /** Enable autocapture */
54
61
  autocapture?: boolean;
55
- /** Enable web vitals tracking */
56
- capture_performance?: boolean;
62
+ /**
63
+ * Enable web vitals tracking.
64
+ * Can be a boolean or an object with detailed configuration.
65
+ */
66
+ capture_performance?: boolean | CapturePerformanceConfig;
57
67
  /** Enable page view tracking */
58
68
  capture_pageview?: boolean | "auto";
59
69
  /** Enable page leave tracking */
@@ -72,6 +82,10 @@ interface VTiltConfig {
72
82
  respect_dnt?: boolean;
73
83
  /** Opt users out by default */
74
84
  opt_out_capturing_by_default?: boolean;
85
+ /** Session recording configuration */
86
+ session_recording?: SessionRecordingOptions;
87
+ /** Disable session recording (convenience flag) */
88
+ disable_session_recording?: boolean;
75
89
  /** Global attributes added to all events */
76
90
  globalAttributes?: Record<string, string>;
77
91
  /** Bootstrap data for initialization */
@@ -157,6 +171,29 @@ interface AliasEvent {
157
171
  distinct_id: string;
158
172
  original: string;
159
173
  }
174
+ /** Supported Web Vitals metrics */
175
+ type SupportedWebVitalsMetric = "LCP" | "CLS" | "FCP" | "INP" | "TTFB";
176
+ /** All supported Web Vitals metrics */
177
+ declare const ALL_WEB_VITALS_METRICS: SupportedWebVitalsMetric[];
178
+ /** Default Web Vitals metrics (matches PostHog defaults) */
179
+ declare const DEFAULT_WEB_VITALS_METRICS: SupportedWebVitalsMetric[];
180
+ /**
181
+ * Web Vitals capture configuration
182
+ */
183
+ interface CapturePerformanceConfig {
184
+ /** Enable or disable web vitals capture */
185
+ web_vitals?: boolean;
186
+ /** Which metrics to capture (default: LCP, CLS, FCP, INP) */
187
+ web_vitals_allowed_metrics?: SupportedWebVitalsMetric[];
188
+ /** Delay before flushing metrics in ms (default: 5000) */
189
+ web_vitals_delayed_flush_ms?: number;
190
+ /**
191
+ * Maximum allowed metric value in ms (default: 900000 = 15 minutes)
192
+ * Values above this are considered anomalies and ignored.
193
+ * Set to 0 to disable this check.
194
+ */
195
+ __web_vitals_max_value?: number;
196
+ }
160
197
  interface WebVitalMetric {
161
198
  name: string;
162
199
  value: number;
@@ -164,6 +201,10 @@ interface WebVitalMetric {
164
201
  rating: "good" | "needs-improvement" | "poor";
165
202
  id: string;
166
203
  navigationType: string;
204
+ /** Timestamp when the metric was captured (added internally) */
205
+ timestamp?: number;
206
+ /** Attribution data from web-vitals library */
207
+ attribution?: Record<string, unknown>;
167
208
  }
168
209
  interface GeolocationData {
169
210
  country?: string;
@@ -184,16 +225,85 @@ interface RequestOptions {
184
225
  timeout?: number;
185
226
  retry?: boolean;
186
227
  }
228
+ /** Mask options for input elements in session recording */
229
+ interface SessionRecordingMaskInputOptions {
230
+ color?: boolean;
231
+ date?: boolean;
232
+ "datetime-local"?: boolean;
233
+ email?: boolean;
234
+ month?: boolean;
235
+ number?: boolean;
236
+ range?: boolean;
237
+ search?: boolean;
238
+ tel?: boolean;
239
+ text?: boolean;
240
+ time?: boolean;
241
+ url?: boolean;
242
+ week?: boolean;
243
+ textarea?: boolean;
244
+ select?: boolean;
245
+ password?: boolean;
246
+ }
247
+ /** Session recording configuration */
248
+ interface SessionRecordingOptions {
249
+ /** Enable session recording */
250
+ enabled?: boolean;
251
+ /** Sample rate (0-1, where 1 = 100%) */
252
+ sampleRate?: number;
253
+ /** Minimum session duration in ms before sending */
254
+ minimumDurationMs?: number;
255
+ /** Session idle threshold in ms (default: 5 minutes) */
256
+ sessionIdleThresholdMs?: number;
257
+ /** Full snapshot interval in ms (default: 5 minutes) */
258
+ fullSnapshotIntervalMs?: number;
259
+ /** Enable console log capture */
260
+ captureConsole?: boolean;
261
+ /** Enable network request capture */
262
+ captureNetwork?: boolean;
263
+ /** Canvas recording settings */
264
+ captureCanvas?: {
265
+ recordCanvas?: boolean;
266
+ canvasFps?: number;
267
+ canvasQuality?: number;
268
+ };
269
+ /** Block class for elements to hide (default: 'vt-no-capture') */
270
+ blockClass?: string;
271
+ /** Block selector for elements to hide */
272
+ blockSelector?: string;
273
+ /** Ignore class for input masking (default: 'vt-ignore-input') */
274
+ ignoreClass?: string;
275
+ /** Mask text class (default: 'vt-mask') */
276
+ maskTextClass?: string;
277
+ /** Mask text selector */
278
+ maskTextSelector?: string;
279
+ /** Mask all inputs (default: true) */
280
+ maskAllInputs?: boolean;
281
+ /** Mask input options */
282
+ maskInputOptions?: SessionRecordingMaskInputOptions;
283
+ /** Masking configuration */
284
+ masking?: {
285
+ maskAllInputs?: boolean;
286
+ maskTextSelector?: string;
287
+ blockSelector?: string;
288
+ };
289
+ /** Record headers in network requests */
290
+ recordHeaders?: boolean;
291
+ /** Record body in network requests */
292
+ recordBody?: boolean;
293
+ /** Compress events before sending (default: true) */
294
+ compressEvents?: boolean;
295
+ /** Internal: Mutation throttler refill rate */
296
+ __mutationThrottlerRefillRate?: number;
297
+ /** Internal: Mutation throttler bucket size */
298
+ __mutationThrottlerBucketSize?: number;
299
+ }
187
300
  interface RemoteConfig {
188
301
  /** Default to identified_only mode */
189
302
  defaultIdentifiedOnly?: boolean;
190
303
  /** Feature flags */
191
304
  featureFlags?: FeatureFlagsConfig;
192
305
  /** Session recording config */
193
- sessionRecording?: {
194
- enabled?: boolean;
195
- sampleRate?: number;
196
- };
306
+ sessionRecording?: SessionRecordingOptions;
197
307
  }
198
308
 
199
309
  /**
@@ -213,6 +323,150 @@ declare class HistoryAutocapture {
213
323
  private _setupPopstateListener;
214
324
  }
215
325
 
326
+ /**
327
+ * Session Recording Types
328
+ *
329
+ * Type definitions for rrweb session recording.
330
+ * Based on PostHog's implementation.
331
+ */
332
+
333
+ /** Mask options for input elements */
334
+ type MaskInputOptions = Partial<{
335
+ color: boolean;
336
+ date: boolean;
337
+ "datetime-local": boolean;
338
+ email: boolean;
339
+ month: boolean;
340
+ number: boolean;
341
+ range: boolean;
342
+ search: boolean;
343
+ tel: boolean;
344
+ text: boolean;
345
+ time: boolean;
346
+ url: boolean;
347
+ week: boolean;
348
+ textarea: boolean;
349
+ select: boolean;
350
+ password: boolean;
351
+ }>;
352
+ /** Masking configuration */
353
+ interface MaskingConfig {
354
+ maskAllInputs?: boolean;
355
+ maskTextSelector?: string;
356
+ blockSelector?: string;
357
+ }
358
+ /** Session recording configuration */
359
+ interface SessionRecordingConfig {
360
+ /** Enable session recording */
361
+ enabled?: boolean;
362
+ /** Sample rate (0-1, where 1 = 100%) */
363
+ sampleRate?: number;
364
+ /** Minimum session duration in ms before sending */
365
+ minimumDurationMs?: number;
366
+ /** Session idle threshold in ms */
367
+ sessionIdleThresholdMs?: number;
368
+ /** Full snapshot interval in ms */
369
+ fullSnapshotIntervalMs?: number;
370
+ /** Enable console log capture */
371
+ captureConsole?: boolean;
372
+ /** Enable network request capture */
373
+ captureNetwork?: boolean;
374
+ /** Canvas recording settings */
375
+ captureCanvas?: {
376
+ recordCanvas?: boolean;
377
+ canvasFps?: number;
378
+ canvasQuality?: number;
379
+ };
380
+ /** Masking settings */
381
+ masking?: MaskingConfig;
382
+ /** Block class for elements to hide */
383
+ blockClass?: string;
384
+ /** Block selector for elements to hide */
385
+ blockSelector?: string;
386
+ /** Ignore class for input masking */
387
+ ignoreClass?: string;
388
+ /** Mask text class */
389
+ maskTextClass?: string;
390
+ /** Mask text selector */
391
+ maskTextSelector?: string;
392
+ /** Mask all inputs */
393
+ maskAllInputs?: boolean;
394
+ /** Mask input options */
395
+ maskInputOptions?: MaskInputOptions;
396
+ /** Record headers in network requests */
397
+ recordHeaders?: boolean;
398
+ /** Record body in network requests */
399
+ recordBody?: boolean;
400
+ /** Compress events before sending */
401
+ compressEvents?: boolean;
402
+ /** Internal: Mutation throttler refill rate */
403
+ __mutationThrottlerRefillRate?: number;
404
+ /** Internal: Mutation throttler bucket size */
405
+ __mutationThrottlerBucketSize?: number;
406
+ }
407
+ /** Recording start reason */
408
+ type SessionStartReason = "recording_initialized" | "session_id_changed" | "linked_flag_matched" | "linked_flag_overridden" | "sampling_overridden" | "url_trigger_matched" | "event_trigger_matched" | "sampled";
409
+
410
+ /**
411
+ * Session Recording Wrapper
412
+ *
413
+ * Lightweight wrapper that handles the decision of WHEN to load recording.
414
+ * The actual recording logic is in LazyLoadedSessionRecording which is
415
+ * loaded on demand.
416
+ *
417
+ * Based on PostHog's sessionrecording-wrapper.ts
418
+ */
419
+
420
+ /** Status when lazy loading is in progress */
421
+ declare const LAZY_LOADING: "lazy_loading";
422
+ /** Session recording status */
423
+ type SessionRecordingStatus = "disabled" | "buffering" | "active" | "paused" | "sampled" | "trigger_pending" | typeof LAZY_LOADING;
424
+
425
+ /**
426
+ * Session Recording Wrapper
427
+ *
428
+ * This is the lightweight class that lives in the main bundle.
429
+ * It handles:
430
+ * - Deciding if recording should be enabled
431
+ * - Lazy loading the actual recording code
432
+ * - Delegating to LazyLoadedSessionRecording
433
+ */
434
+ declare class SessionRecordingWrapper {
435
+ private readonly _instance;
436
+ private _lazyLoadedRecording;
437
+ private _config;
438
+ constructor(_instance: VTilt, config?: SessionRecordingConfig);
439
+ get started(): boolean;
440
+ get status(): SessionRecordingStatus;
441
+ get sessionId(): string;
442
+ /**
443
+ * Start recording if enabled, otherwise stop
444
+ */
445
+ startIfEnabledOrStop(startReason?: SessionStartReason): void;
446
+ /**
447
+ * Stop recording
448
+ */
449
+ stopRecording(): void;
450
+ /**
451
+ * Log a message to the recording
452
+ */
453
+ log(message: string, level?: "log" | "warn" | "error"): void;
454
+ /**
455
+ * Update configuration
456
+ */
457
+ updateConfig(config: Partial<SessionRecordingConfig>): void;
458
+ private get _isRecordingEnabled();
459
+ private get _scriptName();
460
+ /**
461
+ * Lazy load the recording script and start
462
+ */
463
+ private _lazyLoadAndStart;
464
+ /**
465
+ * Called after the recording script is loaded
466
+ */
467
+ private _onScriptLoaded;
468
+ }
469
+
216
470
  /**
217
471
  * Request Queue - Event Batching (PostHog-style)
218
472
  *
@@ -234,6 +488,7 @@ interface QueuedRequest {
234
488
  }
235
489
 
236
490
  declare class VTilt {
491
+ readonly version = "1.1.5";
237
492
  private configManager;
238
493
  private sessionManager;
239
494
  private userManager;
@@ -242,6 +497,7 @@ declare class VTilt {
242
497
  private retryQueue;
243
498
  private rateLimiter;
244
499
  historyAutocapture?: HistoryAutocapture;
500
+ sessionRecording?: SessionRecordingWrapper;
245
501
  __loaded: boolean;
246
502
  private _initial_pageview_captured;
247
503
  private _visibility_state_listener;
@@ -468,10 +724,43 @@ declare class VTilt {
468
724
  * Get current session ID
469
725
  */
470
726
  getSessionId(): string | null;
727
+ /**
728
+ * Get current distinct ID
729
+ */
730
+ getDistinctId(): string;
731
+ /**
732
+ * Get anonymous ID
733
+ */
734
+ getAnonymousId(): string;
471
735
  /**
472
736
  * Update configuration
473
737
  */
474
738
  updateConfig(config: Partial<VTiltConfig>): void;
739
+ /**
740
+ * Initialize session recording
741
+ */
742
+ private _initSessionRecording;
743
+ /**
744
+ * Build session recording config from VTiltConfig
745
+ */
746
+ private _buildSessionRecordingConfig;
747
+ /**
748
+ * Start session recording
749
+ * Call this to manually start recording if it wasn't enabled initially
750
+ */
751
+ startSessionRecording(): void;
752
+ /**
753
+ * Stop session recording
754
+ */
755
+ stopSessionRecording(): void;
756
+ /**
757
+ * Check if session recording is active
758
+ */
759
+ isSessionRecordingActive(): boolean;
760
+ /**
761
+ * Get session recording ID
762
+ */
763
+ getSessionRecordingId(): string | null;
475
764
  /**
476
765
  * _execute_array() deals with processing any vTilt function
477
766
  * calls that were called before the vTilt library was loaded
@@ -493,5 +782,5 @@ declare class VTilt {
493
782
 
494
783
  declare const vt: VTilt;
495
784
 
496
- export { VTilt, vt as default, vt };
497
- export type { AliasEvent, CaptureOptions, CaptureResult, EventPayload, FeatureFlagsConfig, GeolocationData, GroupsConfig, PersistenceMethod, Properties, Property, PropertyOperations, RemoteConfig, RequestOptions, SessionData, SessionIdChangedCallback, TrackingEvent, UserIdentity, UserProperties, VTiltConfig, WebVitalMetric };
785
+ export { ALL_WEB_VITALS_METRICS, DEFAULT_WEB_VITALS_METRICS, VTilt, vt as default, vt };
786
+ export type { AliasEvent, CaptureOptions, CapturePerformanceConfig, CaptureResult, EventPayload, FeatureFlagsConfig, GeolocationData, GroupsConfig, PersistenceMethod, Properties, Property, PropertyOperations, RemoteConfig, RequestOptions, SessionData, SessionIdChangedCallback, SessionRecordingMaskInputOptions, SessionRecordingOptions, SupportedWebVitalsMetric, TrackingEvent, UserIdentity, UserProperties, VTiltConfig, WebVitalMetric };