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 +133 -0
- package/dist/api.d.ts +25 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +61 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -0
- package/dist/screenshot.d.ts +12 -0
- package/dist/screenshot.d.ts.map +1 -0
- package/dist/screenshot.js +42 -0
- package/dist/tracker.d.ts +33 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +164 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/package.json +64 -0
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=
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/tracker.js
ADDED
|
@@ -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==
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|