journey-mapper-tracker 1.0.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 ADDED
@@ -0,0 +1,133 @@
1
+ # Journey Mapper Tracker SDK
2
+
3
+ Track user page flows and capture screenshots automatically for UX research and analysis.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install journey-mapper-tracker
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { JourneyTracker } from 'journey-mapper-tracker';
15
+
16
+ // Initialize the tracker
17
+ JourneyTracker.init({
18
+ apiKey: 'jm_your_api_key_here',
19
+ endpoint: 'https://your-journey-mapper-instance.com', // optional
20
+ captureDelay: 1000, // optional, ms to wait after navigation
21
+ excludedRoutes: ['/admin/*', '/login'], // optional
22
+ debug: false, // optional
23
+ });
24
+
25
+ // Manually capture a page (optional)
26
+ await JourneyTracker.capture();
27
+
28
+ // Stop tracking when done
29
+ JourneyTracker.stop();
30
+ ```
31
+
32
+ ## React/Next.js Integration
33
+
34
+ ### Option 1: Use the Provider Component
35
+
36
+ ```tsx
37
+ // components/JourneyTrackerProvider.tsx
38
+ "use client";
39
+
40
+ import { useEffect } from "react";
41
+ import { JourneyTracker } from "journey-mapper-tracker";
42
+
43
+ export function JourneyTrackerProvider({
44
+ apiKey,
45
+ children
46
+ }: {
47
+ apiKey: string;
48
+ children: React.ReactNode;
49
+ }) {
50
+ useEffect(() => {
51
+ JourneyTracker.init({
52
+ apiKey,
53
+ endpoint: window.location.origin,
54
+ debug: process.env.NODE_ENV === 'development',
55
+ });
56
+
57
+ return () => {
58
+ JourneyTracker.stop();
59
+ };
60
+ }, [apiKey]);
61
+
62
+ return <>{children}</>;
63
+ }
64
+ ```
65
+
66
+ ### Option 2: Initialize in Layout
67
+
68
+ ```tsx
69
+ // app/layout.tsx (Next.js 13+)
70
+ "use client";
71
+
72
+ import { useEffect } from 'react';
73
+ import { JourneyTracker } from 'journey-mapper-tracker';
74
+
75
+ export default function RootLayout({ children }) {
76
+ useEffect(() => {
77
+ JourneyTracker.init({
78
+ apiKey: process.env.NEXT_PUBLIC_JOURNEY_MAPPER_KEY!,
79
+ debug: true,
80
+ });
81
+ }, []);
82
+
83
+ return (
84
+ <html>
85
+ <body>{children}</body>
86
+ </html>
87
+ );
88
+ }
89
+ ```
90
+
91
+ ## Configuration Options
92
+
93
+ | Option | Type | Default | Description |
94
+ |--------|------|---------|-------------|
95
+ | `apiKey` | `string` | **required** | Your project API key from Journey Mapper |
96
+ | `endpoint` | `string` | `window.location.origin` | Your Journey Mapper server URL |
97
+ | `captureDelay` | `number` | `1000` | Milliseconds to wait after navigation before capturing |
98
+ | `excludedRoutes` | `string[]` | `[]` | Routes to skip (supports wildcards like `/admin/*`) |
99
+ | `debug` | `boolean` | `false` | Enable console logging for debugging |
100
+
101
+ ## API Reference
102
+
103
+ ### `JourneyTracker.init(config)`
104
+
105
+ Initialize and start tracking. Must be called before any other methods.
106
+
107
+ ### `JourneyTracker.stop()`
108
+
109
+ Stop tracking and complete the current session. Call this when unmounting or when you want to end the session.
110
+
111
+ ### `JourneyTracker.capture()`
112
+
113
+ Manually capture the current page. Useful for capturing state after user interactions that don't trigger navigation.
114
+
115
+ ### `JourneyTracker.isInitialized()`
116
+
117
+ Returns `true` if the tracker is initialized and running.
118
+
119
+ ## How It Works
120
+
121
+ 1. **Automatic Detection**: The SDK detects page navigations (including SPA navigation via `pushState`/`replaceState`)
122
+ 2. **Screenshot Capture**: Uses `html2canvas` to capture full-page screenshots
123
+ 3. **Data Upload**: Sends captured data to your Journey Mapper instance
124
+ 4. **Session Management**: Groups all captured pages into a session for easy analysis
125
+
126
+ ## Requirements
127
+
128
+ - Browser environment (not compatible with SSR/Node.js)
129
+ - React 17+ (optional - works with any framework)
130
+
131
+ ## License
132
+
133
+ MIT
package/dist/api.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { TrackerConfig, PageData, SessionData } from './types';
2
+ /**
3
+ * API client for communicating with Journey Mapper backend
4
+ */
5
+ export declare class ApiClient {
6
+ private apiKey;
7
+ private endpoint;
8
+ private debug;
9
+ constructor(config: TrackerConfig);
10
+ private log;
11
+ private request;
12
+ /**
13
+ * Start a new tracking session
14
+ */
15
+ startSession(sessionData: SessionData): Promise<void>;
16
+ /**
17
+ * Send a page capture
18
+ */
19
+ sendPage(sessionId: string, page: PageData): Promise<void>;
20
+ /**
21
+ * Complete the tracking session
22
+ */
23
+ completeSession(sessionId: string): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI/D;;GAEG;AACH,qBAAa,SAAS;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAU;gBAEX,MAAM,EAAE,aAAa;IAMjC,OAAO,CAAC,GAAG;YAMG,OAAO;IA2BrB;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1D"}
package/dist/api.js ADDED
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApiClient = void 0;
4
+ const DEFAULT_ENDPOINT = 'https://journey-mapper.app';
5
+ /**
6
+ * API client for communicating with Journey Mapper backend
7
+ */
8
+ class ApiClient {
9
+ constructor(config) {
10
+ this.apiKey = config.apiKey;
11
+ this.endpoint = config.endpoint || DEFAULT_ENDPOINT;
12
+ this.debug = config.debug || false;
13
+ }
14
+ log(...args) {
15
+ if (this.debug) {
16
+ console.log('[JourneyTracker]', ...args);
17
+ }
18
+ }
19
+ async request(action, data) {
20
+ const url = `${this.endpoint}/api/sdk/pages`;
21
+ this.log(`Sending ${action} request to ${url}`);
22
+ const response = await fetch(url, {
23
+ method: 'POST',
24
+ headers: {
25
+ 'Content-Type': 'application/json',
26
+ 'x-api-key': this.apiKey,
27
+ },
28
+ body: JSON.stringify({
29
+ action,
30
+ ...data,
31
+ }),
32
+ });
33
+ if (!response.ok) {
34
+ const error = await response.json();
35
+ throw new Error(error.error || `Request failed: ${response.status}`);
36
+ }
37
+ const result = await response.json();
38
+ this.log(`${action} response:`, result);
39
+ return result;
40
+ }
41
+ /**
42
+ * Start a new tracking session
43
+ */
44
+ async startSession(sessionData) {
45
+ await this.request('start', sessionData);
46
+ }
47
+ /**
48
+ * Send a page capture
49
+ */
50
+ async sendPage(sessionId, page) {
51
+ await this.request('page', { sessionId, page });
52
+ }
53
+ /**
54
+ * Complete the tracking session
55
+ */
56
+ async completeSession(sessionId) {
57
+ await this.request('complete', { sessionId });
58
+ }
59
+ }
60
+ exports.ApiClient = ApiClient;
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixDQUFDO0FBRXREOztHQUVHO0FBQ0gsTUFBYSxTQUFTO0lBS2xCLFlBQVksTUFBcUI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxnQkFBZ0IsQ0FBQztRQUNwRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxHQUFHLENBQUMsR0FBRyxJQUFXO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjLEVBQUUsSUFBUztRQUMzQyxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLGdCQUFnQixDQUFDO1FBRTdDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUVoRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDOUIsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLGtCQUFrQjtnQkFDbEMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQzNCO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pCLE1BQU07Z0JBQ04sR0FBRyxJQUFJO2FBQ1YsQ0FBQztTQUNMLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksbUJBQW1CLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEMsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUF3QjtRQUN2QyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBaUIsRUFBRSxJQUFjO1FBQzVDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCO1FBQ25DLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDSjtBQWhFRCw4QkFnRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFja2VyQ29uZmlnLCBQYWdlRGF0YSwgU2Vzc2lvbkRhdGEgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9FTkRQT0lOVCA9ICdodHRwczovL2pvdXJuZXktbWFwcGVyLmFwcCc7XG5cbi8qKlxuICogQVBJIGNsaWVudCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIEpvdXJuZXkgTWFwcGVyIGJhY2tlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUNsaWVudCB7XG4gICAgcHJpdmF0ZSBhcGlLZXk6IHN0cmluZztcbiAgICBwcml2YXRlIGVuZHBvaW50OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkZWJ1ZzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogVHJhY2tlckNvbmZpZykge1xuICAgICAgICB0aGlzLmFwaUtleSA9IGNvbmZpZy5hcGlLZXk7XG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSBjb25maWcuZW5kcG9pbnQgfHwgREVGQVVMVF9FTkRQT0lOVDtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGNvbmZpZy5kZWJ1ZyB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tKb3VybmV5VHJhY2tlcl0nLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVxdWVzdChhY3Rpb246IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5lbmRwb2ludH0vYXBpL3Nkay9wYWdlc2A7XG5cbiAgICAgICAgdGhpcy5sb2coYFNlbmRpbmcgJHthY3Rpb259IHJlcXVlc3QgdG8gJHt1cmx9YCk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3gtYXBpLWtleSc6IHRoaXMuYXBpS2V5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5lcnJvciB8fCBgUmVxdWVzdCBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICB0aGlzLmxvZyhgJHthY3Rpb259IHJlc3BvbnNlOmAsIHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBuZXcgdHJhY2tpbmcgc2Vzc2lvblxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0U2Vzc2lvbihzZXNzaW9uRGF0YTogU2Vzc2lvbkRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0KCdzdGFydCcsIHNlc3Npb25EYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcGFnZSBjYXB0dXJlXG4gICAgICovXG4gICAgYXN5bmMgc2VuZFBhZ2Uoc2Vzc2lvbklkOiBzdHJpbmcsIHBhZ2U6IFBhZ2VEYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCgncGFnZScsIHsgc2Vzc2lvbklkLCBwYWdlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBsZXRlIHRoZSB0cmFja2luZyBzZXNzaW9uXG4gICAgICovXG4gICAgYXN5bmMgY29tcGxldGVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdCgnY29tcGxldGUnLCB7IHNlc3Npb25JZCB9KTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ import { TrackerConfig } from './types';
2
+ export { Tracker } from './tracker';
3
+ export { TrackerConfig, PageData, SessionData } from './types';
4
+ /**
5
+ * JourneyTracker - Main export for easy initialization
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * import { JourneyTracker } from '@journey-mapper/tracker';
10
+ *
11
+ * // Initialize the tracker
12
+ * JourneyTracker.init({
13
+ * apiKey: 'your-api-key',
14
+ * endpoint: 'https://your-journey-mapper-instance.com', // optional
15
+ * captureDelay: 1000, // optional, ms to wait after navigation
16
+ * excludedRoutes: ['/admin/*'], // optional
17
+ * debug: false, // optional
18
+ * });
19
+ *
20
+ * // Later, stop tracking
21
+ * JourneyTracker.stop();
22
+ * ```
23
+ */
24
+ export declare const JourneyTracker: {
25
+ /**
26
+ * Initialize and start the tracker
27
+ */
28
+ init(config: TrackerConfig): Promise<void>;
29
+ /**
30
+ * Stop tracking and complete the session
31
+ */
32
+ stop(): Promise<void>;
33
+ /**
34
+ * Manually capture the current page
35
+ */
36
+ capture(): Promise<void>;
37
+ /**
38
+ * Check if tracker is initialized
39
+ */
40
+ isInitialized(): boolean;
41
+ };
42
+ export default JourneyTracker;
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,cAAc;IACvB;;OAEG;iBACgB,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBhD;;OAEG;YACW,OAAO,CAAC,IAAI,CAAC;IAU3B;;OAEG;eACc,OAAO,CAAC,IAAI,CAAC;IAQ9B;;OAEG;qBACc,OAAO;CAG3B,CAAC;AAEF,eAAe,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JourneyTracker = exports.Tracker = void 0;
4
+ const tracker_1 = require("./tracker");
5
+ var tracker_2 = require("./tracker");
6
+ Object.defineProperty(exports, "Tracker", { enumerable: true, get: function () { return tracker_2.Tracker; } });
7
+ let globalTracker = null;
8
+ /**
9
+ * JourneyTracker - Main export for easy initialization
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * import { JourneyTracker } from '@journey-mapper/tracker';
14
+ *
15
+ * // Initialize the tracker
16
+ * JourneyTracker.init({
17
+ * apiKey: 'your-api-key',
18
+ * endpoint: 'https://your-journey-mapper-instance.com', // optional
19
+ * captureDelay: 1000, // optional, ms to wait after navigation
20
+ * excludedRoutes: ['/admin/*'], // optional
21
+ * debug: false, // optional
22
+ * });
23
+ *
24
+ * // Later, stop tracking
25
+ * JourneyTracker.stop();
26
+ * ```
27
+ */
28
+ exports.JourneyTracker = {
29
+ /**
30
+ * Initialize and start the tracker
31
+ */
32
+ async init(config) {
33
+ if (typeof window === 'undefined') {
34
+ console.warn('[JourneyTracker] Cannot initialize in non-browser environment');
35
+ return;
36
+ }
37
+ if (globalTracker) {
38
+ console.warn('[JourneyTracker] Already initialized');
39
+ return;
40
+ }
41
+ if (!config.apiKey) {
42
+ throw new Error('[JourneyTracker] API key is required');
43
+ }
44
+ globalTracker = new tracker_1.Tracker(config);
45
+ await globalTracker.start();
46
+ },
47
+ /**
48
+ * Stop tracking and complete the session
49
+ */
50
+ async stop() {
51
+ if (!globalTracker) {
52
+ console.warn('[JourneyTracker] Not initialized');
53
+ return;
54
+ }
55
+ await globalTracker.stop();
56
+ globalTracker = null;
57
+ },
58
+ /**
59
+ * Manually capture the current page
60
+ */
61
+ async capture() {
62
+ if (!globalTracker) {
63
+ throw new Error('[JourneyTracker] Not initialized. Call init() first.');
64
+ }
65
+ await globalTracker.capture();
66
+ },
67
+ /**
68
+ * Check if tracker is initialized
69
+ */
70
+ isInitialized() {
71
+ return globalTracker !== null;
72
+ },
73
+ };
74
+ exports.default = exports.JourneyTracker;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQW9DO0FBR3BDLHFDQUFvQztBQUEzQixrR0FBQSxPQUFPLE9BQUE7QUFHaEIsSUFBSSxhQUFhLEdBQW1CLElBQUksQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNVLFFBQUEsY0FBYyxHQUFHO0lBQzFCOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFxQjtRQUM1QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0RBQStELENBQUMsQ0FBQztZQUM5RSxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3JELE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELGFBQWEsR0FBRyxJQUFJLGlCQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsTUFBTSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDTixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2pELE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsYUFBYSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDVCxPQUFPLGFBQWEsS0FBSyxJQUFJLENBQUM7SUFDbEMsQ0FBQztDQUNKLENBQUM7QUFFRixrQkFBZSxzQkFBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhY2tlciB9IGZyb20gJy4vdHJhY2tlcic7XG5pbXBvcnQgeyBUcmFja2VyQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB7IFRyYWNrZXIgfSBmcm9tICcuL3RyYWNrZXInO1xuZXhwb3J0IHsgVHJhY2tlckNvbmZpZywgUGFnZURhdGEsIFNlc3Npb25EYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbmxldCBnbG9iYWxUcmFja2VyOiBUcmFja2VyIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogSm91cm5leVRyYWNrZXIgLSBNYWluIGV4cG9ydCBmb3IgZWFzeSBpbml0aWFsaXphdGlvblxuICogXG4gKiBVc2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IEpvdXJuZXlUcmFja2VyIH0gZnJvbSAnQGpvdXJuZXktbWFwcGVyL3RyYWNrZXInO1xuICogXG4gKiAvLyBJbml0aWFsaXplIHRoZSB0cmFja2VyXG4gKiBKb3VybmV5VHJhY2tlci5pbml0KHtcbiAqICAgYXBpS2V5OiAneW91ci1hcGkta2V5JyxcbiAqICAgZW5kcG9pbnQ6ICdodHRwczovL3lvdXItam91cm5leS1tYXBwZXItaW5zdGFuY2UuY29tJywgLy8gb3B0aW9uYWxcbiAqICAgY2FwdHVyZURlbGF5OiAxMDAwLCAvLyBvcHRpb25hbCwgbXMgdG8gd2FpdCBhZnRlciBuYXZpZ2F0aW9uXG4gKiAgIGV4Y2x1ZGVkUm91dGVzOiBbJy9hZG1pbi8qJ10sIC8vIG9wdGlvbmFsXG4gKiAgIGRlYnVnOiBmYWxzZSwgLy8gb3B0aW9uYWxcbiAqIH0pO1xuICogXG4gKiAvLyBMYXRlciwgc3RvcCB0cmFja2luZ1xuICogSm91cm5leVRyYWNrZXIuc3RvcCgpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBKb3VybmV5VHJhY2tlciA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgdHJhY2tlclxuICAgICAqL1xuICAgIGFzeW5jIGluaXQoY29uZmlnOiBUcmFja2VyQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbSm91cm5leVRyYWNrZXJdIENhbm5vdCBpbml0aWFsaXplIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYmFsVHJhY2tlcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbSm91cm5leVRyYWNrZXJdIEFscmVhZHkgaW5pdGlhbGl6ZWQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29uZmlnLmFwaUtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSm91cm5leVRyYWNrZXJdIEFQSSBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdsb2JhbFRyYWNrZXIgPSBuZXcgVHJhY2tlcihjb25maWcpO1xuICAgICAgICBhd2FpdCBnbG9iYWxUcmFja2VyLnN0YXJ0KCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN0b3AgdHJhY2tpbmcgYW5kIGNvbXBsZXRlIHRoZSBzZXNzaW9uXG4gICAgICovXG4gICAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFnbG9iYWxUcmFja2VyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tKb3VybmV5VHJhY2tlcl0gTm90IGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBnbG9iYWxUcmFja2VyLnN0b3AoKTtcbiAgICAgICAgZ2xvYmFsVHJhY2tlciA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1hbnVhbGx5IGNhcHR1cmUgdGhlIGN1cnJlbnQgcGFnZVxuICAgICAqL1xuICAgIGFzeW5jIGNhcHR1cmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghZ2xvYmFsVHJhY2tlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSm91cm5leVRyYWNrZXJdIE5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0KCkgZmlyc3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBnbG9iYWxUcmFja2VyLmNhcHR1cmUoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdHJhY2tlciBpcyBpbml0aWFsaXplZFxuICAgICAqL1xuICAgIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBnbG9iYWxUcmFja2VyICE9PSBudWxsO1xuICAgIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBKb3VybmV5VHJhY2tlcjtcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Capture a screenshot of the current page using html2canvas
3
+ */
4
+ export declare function captureScreenshot(): Promise<string>;
5
+ /**
6
+ * Get current viewport dimensions
7
+ */
8
+ export declare function getViewport(): {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ //# sourceMappingURL=screenshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../src/screenshot.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBzD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAK/D"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.captureScreenshot = captureScreenshot;
7
+ exports.getViewport = getViewport;
8
+ const html2canvas_1 = __importDefault(require("html2canvas"));
9
+ /**
10
+ * Capture a screenshot of the current page using html2canvas
11
+ */
12
+ async function captureScreenshot() {
13
+ try {
14
+ const canvas = await (0, html2canvas_1.default)(document.body, {
15
+ useCORS: true,
16
+ allowTaint: true,
17
+ logging: false,
18
+ scale: 1, // Use 1x scale to reduce image size
19
+ windowWidth: window.innerWidth,
20
+ windowHeight: window.innerHeight,
21
+ scrollX: 0,
22
+ scrollY: 0,
23
+ });
24
+ // Convert to base64 JPEG for smaller file size
25
+ const dataUrl = canvas.toDataURL('image/jpeg', 0.7);
26
+ return dataUrl;
27
+ }
28
+ catch (error) {
29
+ console.error('[JourneyTracker] Screenshot capture failed:', error);
30
+ throw error;
31
+ }
32
+ }
33
+ /**
34
+ * Get current viewport dimensions
35
+ */
36
+ function getViewport() {
37
+ return {
38
+ width: window.innerWidth,
39
+ height: window.innerHeight,
40
+ };
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyZWVuc2hvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zY3JlZW5zaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsOENBb0JDO0FBS0Qsa0NBS0M7QUFuQ0QsOERBQXNDO0FBRXRDOztHQUVHO0FBQ0ksS0FBSyxVQUFVLGlCQUFpQjtJQUNuQyxJQUFJLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEscUJBQVcsRUFBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQzVDLE9BQU8sRUFBRSxJQUFJO1lBQ2IsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxLQUFLLEVBQUUsQ0FBQyxFQUFFLG9DQUFvQztZQUM5QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDOUIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQ2hDLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLENBQUM7U0FDYixDQUFDLENBQUM7UUFFSCwrQ0FBK0M7UUFDL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxDQUFDO0lBQ2hCLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXO0lBQ3ZCLE9BQU87UUFDSCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVU7UUFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXO0tBQzdCLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcblxuLyoqXG4gKiBDYXB0dXJlIGEgc2NyZWVuc2hvdCBvZiB0aGUgY3VycmVudCBwYWdlIHVzaW5nIGh0bWwyY2FudmFzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjYXB0dXJlU2NyZWVuc2hvdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGF3YWl0IGh0bWwyY2FudmFzKGRvY3VtZW50LmJvZHksIHtcbiAgICAgICAgICAgIHVzZUNPUlM6IHRydWUsXG4gICAgICAgICAgICBhbGxvd1RhaW50OiB0cnVlLFxuICAgICAgICAgICAgbG9nZ2luZzogZmFsc2UsXG4gICAgICAgICAgICBzY2FsZTogMSwgLy8gVXNlIDF4IHNjYWxlIHRvIHJlZHVjZSBpbWFnZSBzaXplXG4gICAgICAgICAgICB3aW5kb3dXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB3aW5kb3dIZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgICAgIHNjcm9sbFg6IDAsXG4gICAgICAgICAgICBzY3JvbGxZOiAwLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIGJhc2U2NCBKUEVHIGZvciBzbWFsbGVyIGZpbGUgc2l6ZVxuICAgICAgICBjb25zdCBkYXRhVXJsID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuNyk7XG4gICAgICAgIHJldHVybiBkYXRhVXJsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tKb3VybmV5VHJhY2tlcl0gU2NyZWVuc2hvdCBjYXB0dXJlIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cblxuLyoqXG4gKiBHZXQgY3VycmVudCB2aWV3cG9ydCBkaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3cG9ydCgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,33 @@
1
+ import { TrackerConfig } from './types';
2
+ /**
3
+ * Core tracker that handles page navigation detection and screenshot capture
4
+ */
5
+ export declare class Tracker {
6
+ private config;
7
+ private apiClient;
8
+ private sessionId;
9
+ private isInitialized;
10
+ private currentUrl;
11
+ private captureTimeout;
12
+ constructor(config: TrackerConfig);
13
+ private log;
14
+ private generateSessionId;
15
+ private isExcluded;
16
+ /**
17
+ * Start tracking
18
+ */
19
+ start(): Promise<void>;
20
+ /**
21
+ * Stop tracking and complete the session
22
+ */
23
+ stop(): Promise<void>;
24
+ private setupNavigationListeners;
25
+ private removeNavigationListeners;
26
+ private handleNavigation;
27
+ private capturePage;
28
+ /**
29
+ * Manually trigger a page capture
30
+ */
31
+ capture(): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAIxC;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,aAAa;IAWjC,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,OAAO,CAAC,wBAAwB;IAuBhC,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,gBAAgB,CAmBtB;YAEY,WAAW;IA2BzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAMjC"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Tracker = void 0;
4
+ const api_1 = require("./api");
5
+ const screenshot_1 = require("./screenshot");
6
+ /**
7
+ * Core tracker that handles page navigation detection and screenshot capture
8
+ */
9
+ class Tracker {
10
+ constructor(config) {
11
+ this.isInitialized = false;
12
+ this.currentUrl = '';
13
+ this.captureTimeout = null;
14
+ this.handleNavigation = () => {
15
+ const newUrl = window.location.href;
16
+ if (newUrl === this.currentUrl) {
17
+ return;
18
+ }
19
+ this.log('Navigation detected:', this.currentUrl, '->', newUrl);
20
+ this.currentUrl = newUrl;
21
+ // Clear existing timeout
22
+ if (this.captureTimeout) {
23
+ clearTimeout(this.captureTimeout);
24
+ }
25
+ // Delay capture to allow page to render
26
+ this.captureTimeout = setTimeout(() => {
27
+ this.capturePage();
28
+ }, this.config.captureDelay);
29
+ };
30
+ this.config = {
31
+ captureDelay: 1000, // Default 1s delay after navigation
32
+ excludedRoutes: [],
33
+ debug: false,
34
+ ...config,
35
+ };
36
+ this.apiClient = new api_1.ApiClient(config);
37
+ this.sessionId = this.generateSessionId();
38
+ }
39
+ log(...args) {
40
+ if (this.config.debug) {
41
+ console.log('[JourneyTracker]', ...args);
42
+ }
43
+ }
44
+ generateSessionId() {
45
+ return `jm_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
46
+ }
47
+ isExcluded(url) {
48
+ const path = new URL(url).pathname;
49
+ return (this.config.excludedRoutes || []).some(route => {
50
+ if (route.includes('*')) {
51
+ const regex = new RegExp(route.replace(/\*/g, '.*'));
52
+ return regex.test(path);
53
+ }
54
+ return path === route || path.startsWith(route);
55
+ });
56
+ }
57
+ /**
58
+ * Start tracking
59
+ */
60
+ async start() {
61
+ if (this.isInitialized) {
62
+ this.log('Already initialized');
63
+ return;
64
+ }
65
+ this.log('Starting tracker with session:', this.sessionId);
66
+ try {
67
+ // Start session on backend
68
+ await this.apiClient.startSession({
69
+ sessionId: this.sessionId,
70
+ userAgent: navigator.userAgent,
71
+ });
72
+ // Set up navigation listeners
73
+ this.setupNavigationListeners();
74
+ // Capture initial page
75
+ this.currentUrl = window.location.href;
76
+ await this.capturePage();
77
+ this.isInitialized = true;
78
+ this.log('Tracker started successfully');
79
+ }
80
+ catch (error) {
81
+ console.error('[JourneyTracker] Failed to start:', error);
82
+ throw error;
83
+ }
84
+ }
85
+ /**
86
+ * Stop tracking and complete the session
87
+ */
88
+ async stop() {
89
+ if (!this.isInitialized) {
90
+ return;
91
+ }
92
+ this.log('Stopping tracker');
93
+ try {
94
+ await this.apiClient.completeSession(this.sessionId);
95
+ this.removeNavigationListeners();
96
+ this.isInitialized = false;
97
+ this.log('Tracker stopped successfully');
98
+ }
99
+ catch (error) {
100
+ console.error('[JourneyTracker] Failed to stop:', error);
101
+ }
102
+ }
103
+ setupNavigationListeners() {
104
+ // Listen for popstate (browser back/forward)
105
+ window.addEventListener('popstate', this.handleNavigation);
106
+ // Monkey-patch pushState and replaceState for SPA navigation
107
+ const originalPushState = history.pushState;
108
+ const originalReplaceState = history.replaceState;
109
+ history.pushState = (...args) => {
110
+ originalPushState.apply(history, args);
111
+ this.handleNavigation();
112
+ };
113
+ history.replaceState = (...args) => {
114
+ originalReplaceState.apply(history, args);
115
+ this.handleNavigation();
116
+ };
117
+ // Store originals for cleanup
118
+ window.__jm_originalPushState = originalPushState;
119
+ window.__jm_originalReplaceState = originalReplaceState;
120
+ }
121
+ removeNavigationListeners() {
122
+ window.removeEventListener('popstate', this.handleNavigation);
123
+ // Restore original methods
124
+ if (window.__jm_originalPushState) {
125
+ history.pushState = window.__jm_originalPushState;
126
+ }
127
+ if (window.__jm_originalReplaceState) {
128
+ history.replaceState = window.__jm_originalReplaceState;
129
+ }
130
+ }
131
+ async capturePage() {
132
+ const url = window.location.href;
133
+ if (this.isExcluded(url)) {
134
+ this.log('Skipping excluded route:', url);
135
+ return;
136
+ }
137
+ this.log('Capturing page:', url);
138
+ try {
139
+ const screenshot = await (0, screenshot_1.captureScreenshot)();
140
+ const viewport = (0, screenshot_1.getViewport)();
141
+ await this.apiClient.sendPage(this.sessionId, {
142
+ url,
143
+ title: document.title,
144
+ screenshot,
145
+ viewport,
146
+ });
147
+ this.log('Page captured successfully');
148
+ }
149
+ catch (error) {
150
+ console.error('[JourneyTracker] Failed to capture page:', error);
151
+ }
152
+ }
153
+ /**
154
+ * Manually trigger a page capture
155
+ */
156
+ async capture() {
157
+ if (!this.isInitialized) {
158
+ throw new Error('Tracker not initialized. Call start() first.');
159
+ }
160
+ await this.capturePage();
161
+ }
162
+ }
163
+ exports.Tracker = Tracker;
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90cmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLCtCQUFrQztBQUNsQyw2Q0FBOEQ7QUFFOUQ7O0dBRUc7QUFDSCxNQUFhLE9BQU87SUFRaEIsWUFBWSxNQUFxQjtRQUp6QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLG1CQUFjLEdBQTBCLElBQUksQ0FBQztRQTBIN0MscUJBQWdCLEdBQUcsR0FBUyxFQUFFO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBRXBDLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDN0IsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1lBRXpCLHlCQUF5QjtZQUN6QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBRUQsd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQTFJRSxJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1YsWUFBWSxFQUFFLElBQUksRUFBRSxvQ0FBb0M7WUFDeEQsY0FBYyxFQUFFLEVBQUU7WUFDbEIsS0FBSyxFQUFFLEtBQUs7WUFDWixHQUFHLE1BQU07U0FD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QUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0o7QUF6TEQsMEJBeUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhY2tlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpQ2xpZW50IH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgY2FwdHVyZVNjcmVlbnNob3QsIGdldFZpZXdwb3J0IH0gZnJvbSAnLi9zY3JlZW5zaG90JztcblxuLyoqXG4gKiBDb3JlIHRyYWNrZXIgdGhhdCBoYW5kbGVzIHBhZ2UgbmF2aWdhdGlvbiBkZXRlY3Rpb24gYW5kIHNjcmVlbnNob3QgY2FwdHVyZVxuICovXG5leHBvcnQgY2xhc3MgVHJhY2tlciB7XG4gICAgcHJpdmF0ZSBjb25maWc6IFRyYWNrZXJDb25maWc7XG4gICAgcHJpdmF0ZSBhcGlDbGllbnQ6IEFwaUNsaWVudDtcbiAgICBwcml2YXRlIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHByaXZhdGUgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgY3VycmVudFVybDogc3RyaW5nID0gJyc7XG4gICAgcHJpdmF0ZSBjYXB0dXJlVGltZW91dDogTm9kZUpTLlRpbWVvdXQgfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogVHJhY2tlckNvbmZpZykge1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgICAgIGNhcHR1cmVEZWxheTogMTAwMCwgLy8gRGVmYXVsdCAxcyBkZWxheSBhZnRlciBuYXZpZ2F0aW9uXG4gICAgICAgICAgICBleGNsdWRlZFJvdXRlczogW10sXG4gICAgICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXBpQ2xpZW50ID0gbmV3IEFwaUNsaWVudChjb25maWcpO1xuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHRoaXMuZ2VuZXJhdGVTZXNzaW9uSWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZyguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbSm91cm5leVRyYWNrZXJdJywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlU2Vzc2lvbklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgam1fJHtEYXRlLm5vdygpfV8ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCAxMSl9YDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRXhjbHVkZWQodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZTtcbiAgICAgICAgcmV0dXJuICh0aGlzLmNvbmZpZy5leGNsdWRlZFJvdXRlcyB8fCBbXSkuc29tZShyb3V0ZSA9PiB7XG4gICAgICAgICAgICBpZiAocm91dGUuaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChyb3V0ZS5yZXBsYWNlKC9cXCovZywgJy4qJykpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdGggPT09IHJvdXRlIHx8IHBhdGguc3RhcnRzV2l0aChyb3V0ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRyYWNraW5nXG4gICAgICovXG4gICAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKCdBbHJlYWR5IGluaXRpYWxpemVkJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZygnU3RhcnRpbmcgdHJhY2tlciB3aXRoIHNlc3Npb246JywgdGhpcy5zZXNzaW9uSWQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBTdGFydCBzZXNzaW9uIG9uIGJhY2tlbmRcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBpQ2xpZW50LnN0YXJ0U2Vzc2lvbih7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gU2V0IHVwIG5hdmlnYXRpb24gbGlzdGVuZXJzXG4gICAgICAgICAgICB0aGlzLnNldHVwTmF2aWdhdGlvbkxpc3RlbmVycygpO1xuXG4gICAgICAgICAgICAvLyBDYXB0dXJlIGluaXRpYWwgcGFnZVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhcHR1cmVQYWdlKCk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxvZygnVHJhY2tlciBzdGFydGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0pvdXJuZXlUcmFja2VyXSBGYWlsZWQgdG8gc3RhcnQ6JywgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHRyYWNraW5nIGFuZCBjb21wbGV0ZSB0aGUgc2Vzc2lvblxuICAgICAqL1xuICAgIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZygnU3RvcHBpbmcgdHJhY2tlcicpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwaUNsaWVudC5jb21wbGV0ZVNlc3Npb24odGhpcy5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVOYXZpZ2F0aW9uTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubG9nKCdUcmFja2VyIHN0b3BwZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSm91cm5leVRyYWNrZXJdIEZhaWxlZCB0byBzdG9wOicsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBOYXZpZ2F0aW9uTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIHBvcHN0YXRlIChicm93c2VyIGJhY2svZm9yd2FyZClcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgdGhpcy5oYW5kbGVOYXZpZ2F0aW9uKTtcblxuICAgICAgICAvLyBNb25rZXktcGF0Y2ggcHVzaFN0YXRlIGFuZCByZXBsYWNlU3RhdGUgZm9yIFNQQSBuYXZpZ2F0aW9uXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUHVzaFN0YXRlID0gaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVwbGFjZVN0YXRlID0gaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgb3JpZ2luYWxQdXNoU3RhdGUuYXBwbHkoaGlzdG9yeSwgYXJncyk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5hdmlnYXRpb24oKTtcbiAgICAgICAgfTtcblxuICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBvcmlnaW5hbFJlcGxhY2VTdGF0ZS5hcHBseShoaXN0b3J5LCBhcmdzKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGlvbigpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFN0b3JlIG9yaWdpbmFscyBmb3IgY2xlYW51cFxuICAgICAgICAod2luZG93IGFzIGFueSkuX19qbV9vcmlnaW5hbFB1c2hTdGF0ZSA9IG9yaWdpbmFsUHVzaFN0YXRlO1xuICAgICAgICAod2luZG93IGFzIGFueSkuX19qbV9vcmlnaW5hbFJlcGxhY2VTdGF0ZSA9IG9yaWdpbmFsUmVwbGFjZVN0YXRlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTmF2aWdhdGlvbkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgdGhpcy5oYW5kbGVOYXZpZ2F0aW9uKTtcblxuICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIG1ldGhvZHNcbiAgICAgICAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX2ptX29yaWdpbmFsUHVzaFN0YXRlKSB7XG4gICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSA9ICh3aW5kb3cgYXMgYW55KS5fX2ptX29yaWdpbmFsUHVzaFN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgod2luZG93IGFzIGFueSkuX19qbV9vcmlnaW5hbFJlcGxhY2VTdGF0ZSkge1xuICAgICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUgPSAod2luZG93IGFzIGFueSkuX19qbV9vcmlnaW5hbFJlcGxhY2VTdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlTmF2aWdhdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbmV3VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cbiAgICAgICAgaWYgKG5ld1VybCA9PT0gdGhpcy5jdXJyZW50VXJsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZygnTmF2aWdhdGlvbiBkZXRlY3RlZDonLCB0aGlzLmN1cnJlbnRVcmwsICctPicsIG5ld1VybCk7XG4gICAgICAgIHRoaXMuY3VycmVudFVybCA9IG5ld1VybDtcblxuICAgICAgICAvLyBDbGVhciBleGlzdGluZyB0aW1lb3V0XG4gICAgICAgIGlmICh0aGlzLmNhcHR1cmVUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYXB0dXJlVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWxheSBjYXB0dXJlIHRvIGFsbG93IHBhZ2UgdG8gcmVuZGVyXG4gICAgICAgIHRoaXMuY2FwdHVyZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2FwdHVyZVBhZ2UoKTtcbiAgICAgICAgfSwgdGhpcy5jb25maWcuY2FwdHVyZURlbGF5KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyBjYXB0dXJlUGFnZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFeGNsdWRlZCh1cmwpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZygnU2tpcHBpbmcgZXhjbHVkZWQgcm91dGU6JywgdXJsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nKCdDYXB0dXJpbmcgcGFnZTonLCB1cmwpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5zaG90ID0gYXdhaXQgY2FwdHVyZVNjcmVlbnNob3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gZ2V0Vmlld3BvcnQoKTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGlDbGllbnQuc2VuZFBhZ2UodGhpcy5zZXNzaW9uSWQsIHtcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGRvY3VtZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgIHNjcmVlbnNob3QsXG4gICAgICAgICAgICAgICAgdmlld3BvcnQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5sb2coJ1BhZ2UgY2FwdHVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSm91cm5leVRyYWNrZXJdIEZhaWxlZCB0byBjYXB0dXJlIHBhZ2U6JywgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFudWFsbHkgdHJpZ2dlciBhIHBhZ2UgY2FwdHVyZVxuICAgICAqL1xuICAgIGFzeW5jIGNhcHR1cmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYWNrZXIgbm90IGluaXRpYWxpemVkLiBDYWxsIHN0YXJ0KCkgZmlyc3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5jYXB0dXJlUGFnZSgpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,21 @@
1
+ export interface TrackerConfig {
2
+ apiKey: string;
3
+ endpoint?: string;
4
+ captureDelay?: number;
5
+ excludedRoutes?: string[];
6
+ debug?: boolean;
7
+ }
8
+ export interface PageData {
9
+ url: string;
10
+ title: string;
11
+ screenshot: string;
12
+ viewport: {
13
+ width: number;
14
+ height: number;
15
+ };
16
+ }
17
+ export interface SessionData {
18
+ sessionId: string;
19
+ userAgent: string;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAClB,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgVHJhY2tlckNvbmZpZyB7XG4gICAgYXBpS2V5OiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gICAgY2FwdHVyZURlbGF5PzogbnVtYmVyO1xuICAgIGV4Y2x1ZGVkUm91dGVzPzogc3RyaW5nW107XG4gICAgZGVidWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VEYXRhIHtcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHNjcmVlbnNob3Q6IHN0cmluZztcbiAgICB2aWV3cG9ydDoge1xuICAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25EYXRhIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICB1c2VyQWdlbnQ6IHN0cmluZztcbn1cbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "journey-mapper-tracker",
3
+ "version": "1.0.0",
4
+ "description": "Track user page flows and capture screenshots for UX research - Journey Mapper SDK",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "watch": "tsc --watch",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "keywords": [
25
+ "journey-mapper",
26
+ "user-flow",
27
+ "tracking",
28
+ "screenshots",
29
+ "ux-research",
30
+ "user-journey",
31
+ "heatmap",
32
+ "analytics",
33
+ "session-replay",
34
+ "page-flow"
35
+ ],
36
+ "author": "Journey Mapper",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/journey-mapper/tracker"
41
+ },
42
+ "homepage": "https://journeymapper.com",
43
+ "bugs": {
44
+ "url": "https://github.com/journey-mapper/tracker/issues"
45
+ },
46
+ "peerDependencies": {
47
+ "react": ">=17.0.0"
48
+ },
49
+ "peerDependenciesMeta": {
50
+ "react": {
51
+ "optional": true
52
+ }
53
+ },
54
+ "dependencies": {
55
+ "html2canvas": "^1.4.1"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^20.0.0",
59
+ "typescript": "^5.0.0"
60
+ },
61
+ "engines": {
62
+ "node": ">=16.0.0"
63
+ }
64
+ }