fleek-track-analytics 1.17.36 → 1.17.41
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/NODE_JS_BACKEND_INTEGRATION_GUIDE.md +363 -0
- package/README.md +0 -69
- package/lib/node/analytics-tool/node-rudderstack.d.ts +10 -0
- package/lib/node/analytics-tool/node-rudderstack.js +76 -0
- package/lib/node/analytics-tool/node-rudderstack.js.map +1 -0
- package/lib/node/analytics-tool/rudderstack-default-config.js.map +1 -0
- package/lib/node/analytics-tool/rudderstack-event-routing.js +18 -0
- package/lib/node/analytics-tool/rudderstack-event-routing.js.map +1 -0
- package/lib/node/track-analytics/track-analytics-types.d.ts +1 -0
- package/lib/node/track-analytics/track-analytics.d.ts +2 -0
- package/lib/node/track-analytics/track-analytics.js +113 -17
- package/lib/node/track-analytics/track-analytics.js.map +1 -1
- package/lib/react-native/track-analytics/track-analytics.d.ts +0 -2
- package/lib/react-native/track-analytics/track-analytics.js +32 -152
- package/lib/react-native/track-analytics/track-analytics.js.map +1 -1
- package/lib/track-analytics-types.d.ts +0 -5
- package/lib/web/track-analytics/track-analytics.d.ts +0 -2
- package/lib/web/track-analytics/track-analytics.js +38 -139
- package/lib/web/track-analytics/track-analytics.js.map +1 -1
- package/package.json +3 -3
- package/EXPO_RN_TESTING_GUIDE.md +0 -283
- package/lib/react-native/analytics-tool/react-native-rudderstack.d.ts +0 -12
- package/lib/react-native/analytics-tool/react-native-rudderstack.js +0 -87
- package/lib/react-native/analytics-tool/react-native-rudderstack.js.map +0 -1
- package/lib/react-native/analytics-tool/rudderstack-default-config.js +0 -8
- package/lib/react-native/analytics-tool/rudderstack-default-config.js.map +0 -1
- package/lib/react-native/analytics-tool/rudderstack-event-routing.d.ts +0 -6
- package/lib/react-native/analytics-tool/rudderstack-event-routing.js +0 -17
- package/lib/react-native/analytics-tool/rudderstack-event-routing.js.map +0 -1
- package/lib/web/analytics-tool/rudderstack-default-config.d.ts +0 -4
- package/lib/web/analytics-tool/rudderstack-default-config.js.map +0 -1
- package/lib/web/analytics-tool/rudderstack-event-routing.js +0 -16
- package/lib/web/analytics-tool/rudderstack-event-routing.js.map +0 -1
- package/lib/web/analytics-tool/web-rudderstack.d.ts +0 -17
- package/lib/web/analytics-tool/web-rudderstack.js +0 -76
- package/lib/web/analytics-tool/web-rudderstack.js.map +0 -1
- package/spec-files/rudderstack-migration/HLD_LLD.md +0 -353
- package/spec-files/rudderstack-migration/RUDDERSTACK_SELF_HOSTED_PARAMETERS.md +0 -283
- package/spec-files/rudderstack-migration/SEGMENT_VS_RUDDERSTACK_SDK_COMPARISON.md +0 -140
- /package/lib/{react-native → node}/analytics-tool/rudderstack-default-config.d.ts +0 -0
- /package/lib/{web → node}/analytics-tool/rudderstack-default-config.js +0 -0
- /package/lib/{web → node}/analytics-tool/rudderstack-event-routing.d.ts +0 -0
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TrackAnalytics = void 0;
|
|
4
|
+
const constants_1 = require("../../constants");
|
|
4
5
|
const web_segment_1 = require("../analytics-tool/web-segment");
|
|
5
|
-
const web_rudderstack_1 = require("../analytics-tool/web-rudderstack");
|
|
6
|
-
const rudderstack_event_routing_1 = require("../analytics-tool/rudderstack-event-routing");
|
|
7
|
-
const rudderstack_default_config_1 = require("../analytics-tool/rudderstack-default-config");
|
|
8
6
|
const dimension_manager_1 = require("../utils/DImentsionManager/dimension-manager");
|
|
9
7
|
const isbot_1 = require("isbot");
|
|
10
8
|
const check_env_1 = require("../utils/check-env");
|
|
@@ -12,147 +10,62 @@ const index_1 = require("../index");
|
|
|
12
10
|
class TrackAnalytics {
|
|
13
11
|
constructor(params) {
|
|
14
12
|
this.analyticsWrapper = null;
|
|
15
|
-
this.rudderstackWrapper = null;
|
|
16
13
|
this.isCrawlerOrBot = false;
|
|
17
14
|
this.traceManager = null;
|
|
18
15
|
this.initAnalytics = async () => {
|
|
19
|
-
var _a
|
|
20
|
-
if (!(0, check_env_1.isBrowser)()) {
|
|
21
|
-
this.initParams.errorHandler(new Error('TrackAnalytics can only be initialized in a browser environment'));
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
this.isCrawlerOrBot = (0, isbot_1.isbot)(navigator.userAgent);
|
|
25
|
-
if (this.isCrawlerOrBot) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
16
|
+
var _a;
|
|
28
17
|
try {
|
|
18
|
+
if (!(0, check_env_1.isBrowser)()) {
|
|
19
|
+
throw new Error('TrackAnalytics can only be initialized in a browser environment');
|
|
20
|
+
}
|
|
21
|
+
this.isCrawlerOrBot = (0, isbot_1.isbot)(navigator.userAgent);
|
|
22
|
+
if (this.isCrawlerOrBot) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
29
25
|
this.dimensionManager.init();
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
this.initParams.errorHandler(new Error(`Dimension manager init failed: ${error instanceof Error ? error.message : String(error)}. Continuing with SDK initialization.`));
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
26
|
this.analyticsWrapper = (0, web_segment_1.webSegment)({
|
|
36
27
|
segmentKey: this.initParams.segmentKey,
|
|
37
28
|
app: this.initParams.App,
|
|
38
29
|
dimenstionsManager: this.dimensionManager,
|
|
39
30
|
});
|
|
40
|
-
|
|
41
|
-
catch (error) {
|
|
42
|
-
this.initParams.errorHandler(new Error(`Segment initialization failed: ${error instanceof Error ? error.message : String(error)}. Continuing with RudderStack if enabled.`));
|
|
43
|
-
this.analyticsWrapper = null;
|
|
44
|
-
}
|
|
45
|
-
if ((_a = this.initParams.rudderstack) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
46
|
-
try {
|
|
47
|
-
const writeKey = this.initParams.rudderstack.writeKey || rudderstack_default_config_1.RUDDERSTACK_DEFAULT_CONFIG.writeKey;
|
|
48
|
-
const dataPlaneUrl = this.initParams.rudderstack.dataPlaneUrl || rudderstack_default_config_1.RUDDERSTACK_DEFAULT_CONFIG.dataPlaneUrl;
|
|
49
|
-
this.rudderstackWrapper = (0, web_rudderstack_1.webRudderstack)({
|
|
50
|
-
writeKey,
|
|
51
|
-
dataPlaneUrl,
|
|
52
|
-
app: this.initParams.App,
|
|
53
|
-
debug: this.initParams.debug,
|
|
54
|
-
dimenstionsManager: this.dimensionManager,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
this.initParams.errorHandler(new Error(`RudderStack initialization failed: ${error instanceof Error ? error.message : String(error)}. Continuing with Segment if available.`));
|
|
59
|
-
this.rudderstackWrapper = null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
if ((_b = this.initParams.traceManager) === null || _b === void 0 ? void 0 : _b.enabled) {
|
|
63
|
-
try {
|
|
31
|
+
if ((_a = this.initParams.traceManager) === null || _a === void 0 ? void 0 : _a.enabled) {
|
|
64
32
|
this.traceManager = (0, index_1.createWebTraceManager)(this.initParams.traceManager);
|
|
65
33
|
await this.traceManager.initialize();
|
|
66
34
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.initParams.errorHandler(new Error(`AnalyticsWrapper initAnalytics: ${error instanceof Error ? error.message : String(error)}`));
|
|
70
38
|
}
|
|
71
39
|
};
|
|
72
40
|
this.track = async (...args) => {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
const enrichedEvent = this.enrichEvent(eventName, properties);
|
|
81
|
-
if (this.analyticsWrapper) {
|
|
82
|
-
try {
|
|
83
|
-
await this.analyticsWrapper.track(eventName, enrichedEvent);
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
this.initParams.errorHandler(new Error(`Segment track failed for event ${eventName}: ${error instanceof Error ? error.message : String(error)}`));
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (this.rudderstackWrapper && this.shouldSendToRudderstack(eventName)) {
|
|
90
|
-
try {
|
|
91
|
-
await this.rudderstackWrapper.track(eventName, enrichedEvent);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
this.initParams.errorHandler(new Error(`RudderStack track failed for event ${eventName}: ${error instanceof Error ? error.message : String(error)}`));
|
|
41
|
+
var _a;
|
|
42
|
+
if (this.checkInitDone()) {
|
|
43
|
+
const [eventName, properties] = args;
|
|
44
|
+
if (this.isCrawlerOrBot) {
|
|
45
|
+
return;
|
|
95
46
|
}
|
|
47
|
+
const enrichedEvent = this.enrichEvent(eventName, properties);
|
|
48
|
+
return await ((_a = this.analyticsWrapper) === null || _a === void 0 ? void 0 : _a.track(eventName, enrichedEvent));
|
|
96
49
|
}
|
|
97
50
|
};
|
|
98
51
|
this.identify = async (id, traits) => {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (this.analyticsWrapper) {
|
|
104
|
-
try {
|
|
105
|
-
await this.analyticsWrapper.identify(id, enrichedTraits);
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
this.initParams.errorHandler(new Error(`Segment identify failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (this.rudderstackWrapper && this.shouldSendToRudderstack('identify')) {
|
|
112
|
-
try {
|
|
113
|
-
await this.rudderstackWrapper.identify(id, enrichedTraits);
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
this.initParams.errorHandler(new Error(`RudderStack identify failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
117
|
-
}
|
|
52
|
+
var _a;
|
|
53
|
+
if (this.checkInitDone()) {
|
|
54
|
+
const enrichedTraits = this.enrichEvent('identify', traits);
|
|
55
|
+
return await ((_a = this.analyticsWrapper) === null || _a === void 0 ? void 0 : _a.identify(id, enrichedTraits));
|
|
118
56
|
}
|
|
119
57
|
};
|
|
120
58
|
this.page = async (params) => {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if (this.analyticsWrapper) {
|
|
126
|
-
try {
|
|
127
|
-
await this.analyticsWrapper.page(enrichedParams);
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
this.initParams.errorHandler(new Error(`Segment page failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
if (this.rudderstackWrapper && this.shouldSendToRudderstack('page')) {
|
|
134
|
-
try {
|
|
135
|
-
await this.rudderstackWrapper.page(enrichedParams);
|
|
136
|
-
}
|
|
137
|
-
catch (error) {
|
|
138
|
-
this.initParams.errorHandler(new Error(`RudderStack page failed: ${error instanceof Error ? error.message : String(error)}`));
|
|
139
|
-
}
|
|
59
|
+
var _a;
|
|
60
|
+
if (this.checkInitDone()) {
|
|
61
|
+
const enrichedParams = this.enrichEvent('page', params);
|
|
62
|
+
return await ((_a = this.analyticsWrapper) === null || _a === void 0 ? void 0 : _a.page(enrichedParams));
|
|
140
63
|
}
|
|
141
64
|
};
|
|
142
65
|
this.getAnonymousId = async () => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (this.rudderstackWrapper) {
|
|
151
|
-
try {
|
|
152
|
-
return await this.rudderstackWrapper.getAnonymousId();
|
|
153
|
-
}
|
|
154
|
-
catch (error) {
|
|
155
|
-
}
|
|
66
|
+
var _a;
|
|
67
|
+
if (this.checkInitDone()) {
|
|
68
|
+
return await ((_a = this.analyticsWrapper) === null || _a === void 0 ? void 0 : _a.getAnonymousId());
|
|
156
69
|
}
|
|
157
70
|
return Promise.resolve(undefined);
|
|
158
71
|
};
|
|
@@ -180,7 +93,13 @@ class TrackAnalytics {
|
|
|
180
93
|
this.dimensionManager = new dimension_manager_1.DimentionsManger();
|
|
181
94
|
}
|
|
182
95
|
checkInitDone() {
|
|
183
|
-
|
|
96
|
+
if (this.analyticsWrapper) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.initParams.errorHandler(new Error(`AnalyticsWrapper checkInitDone: ${constants_1.ERROR_MESSAGE.ANALYTICS_CALLED_BEFORE_INIT}`));
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
184
103
|
}
|
|
185
104
|
enrichEvent(eventName, eventParams = {}) {
|
|
186
105
|
if (!this.traceManager) {
|
|
@@ -191,26 +110,6 @@ class TrackAnalytics {
|
|
|
191
110
|
const enrichedEvent = Object.assign(Object.assign({}, eventParams), { event: eventName, trace_id: traceContext.trace_id, web_trace_id: traceContext.web_trace_id, session_id: traceContext.session_id, session_start_time: traceContext.session_start_time, is_active: true });
|
|
192
111
|
return enrichedEvent;
|
|
193
112
|
}
|
|
194
|
-
shouldSendToRudderstack(eventName) {
|
|
195
|
-
const config = rudderstack_event_routing_1.rudderstackEventRouting;
|
|
196
|
-
if (!config)
|
|
197
|
-
return false;
|
|
198
|
-
if (config.sendToRudderstack && config.sendToRudderstack.includes(eventName)) {
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
if (config.eventPatterns && config.eventPatterns.length > 0) {
|
|
202
|
-
return config.eventPatterns.some((pattern) => {
|
|
203
|
-
try {
|
|
204
|
-
return new RegExp(pattern).test(eventName);
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
this.initParams.errorHandler(new Error(`Invalid regex pattern in RudderStack event routing: ${pattern}. Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
208
|
-
return false;
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
113
|
}
|
|
215
114
|
exports.TrackAnalytics = TrackAnalytics;
|
|
216
115
|
//# sourceMappingURL=track-analytics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-analytics.js","sourceRoot":"","sources":["../../../src/web/track-analytics/track-analytics.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"track-analytics.js","sourceRoot":"","sources":["../../../src/web/track-analytics/track-analytics.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fleek-track-analytics",
|
|
3
|
-
"version": "1.17.
|
|
3
|
+
"version": "1.17.41",
|
|
4
4
|
"main": "./lib/index.js",
|
|
5
5
|
"types": "./lib/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@react-native-firebase/analytics": "^21.6.2",
|
|
30
|
-
"@rudderstack/analytics-js": "^3.
|
|
31
|
-
"@rudderstack/rudder-sdk-
|
|
30
|
+
"@rudderstack/analytics-js": "^3.26.0",
|
|
31
|
+
"@rudderstack/rudder-sdk-node": "^2.0.0",
|
|
32
32
|
"@segment/analytics-next": "^1.66.0",
|
|
33
33
|
"@segment/analytics-node": "^2.1.0",
|
|
34
34
|
"@segment/analytics-react-native": "^2.19.1",
|
package/EXPO_RN_TESTING_GUIDE.md
DELETED
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
# React Native RudderStack Integration - Expo Testing Guide
|
|
2
|
-
|
|
3
|
-
## Prerequisites
|
|
4
|
-
|
|
5
|
-
1. **Update the library**: First, ensure you have the latest version of `fleek-track-analytics` with RudderStack support
|
|
6
|
-
2. **Expo Managed Workflow**: Since `@rudderstack/rudder-sdk-react-native` requires native dependencies, you'll need a **Custom Dev Client** (not Expo Go)
|
|
7
|
-
|
|
8
|
-
## Step 1: Install/Update Dependencies
|
|
9
|
-
|
|
10
|
-
### Option A: Using Published Package (Recommended for Testing)
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
# Update to the latest version
|
|
14
|
-
yarn add fleek-track-analytics@latest
|
|
15
|
-
# or
|
|
16
|
-
npm install fleek-track-analytics@latest
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Option B: Using Local Package (For Development)
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
# In your app directory, link to local package
|
|
23
|
-
yarn add file:../path/to/fleek-track-analytics
|
|
24
|
-
# or use npm link
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Step 2: Install Native Dependencies
|
|
28
|
-
|
|
29
|
-
The RudderStack React Native SDK requires native code. In Expo managed workflow:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
# Install the RudderStack SDK (should be included in fleek-track-analytics, but verify)
|
|
33
|
-
npx expo install @rudderstack/rudder-sdk-react-native
|
|
34
|
-
|
|
35
|
-
# Install peer dependencies if needed
|
|
36
|
-
npx expo install @react-native-async-storage/async-storage
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## Step 3: Create/Update Custom Dev Client
|
|
40
|
-
|
|
41
|
-
Since Expo Go doesn't support custom native modules, you need a custom dev client:
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
# Create a custom dev client build
|
|
45
|
-
npx expo prebuild
|
|
46
|
-
|
|
47
|
-
# Or if using EAS Build
|
|
48
|
-
eas build --profile development --platform ios
|
|
49
|
-
eas build --profile development --platform android
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**Note**: You cannot test this in Expo Go. You must use a custom dev client.
|
|
53
|
-
|
|
54
|
-
## Step 4: Update Your Analytics Initialization
|
|
55
|
-
|
|
56
|
-
Update your `TrackAnalytics` initialization to include RudderStack configuration:
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
// analytics.ts or similar file
|
|
60
|
-
import { TrackAnalytics } from 'fleek-track-analytics/lib/react-native';
|
|
61
|
-
import { AnalyticsProvider } from 'fleek-track-analytics/lib/segment-exports';
|
|
62
|
-
|
|
63
|
-
const analyticsException = (e: unknown) => {
|
|
64
|
-
if (__DEV__) {
|
|
65
|
-
console.error('[Analytics Error]', JSON.stringify(e));
|
|
66
|
-
} else {
|
|
67
|
-
// Log to production error reporting (e.g., Sentry)
|
|
68
|
-
// Sentry.captureException(e);
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const analyticsWrapper = new TrackAnalytics({
|
|
73
|
-
platform: 'REACT_NATIVE',
|
|
74
|
-
App: 'CONSUMER_APP', // or 'VENDOR_APP' based on your app
|
|
75
|
-
segment: true, // Keep Segment enabled for dual-send
|
|
76
|
-
segmentKey: process.env.EXPO_PUBLIC_SEGMENT_KEY || '',
|
|
77
|
-
devMode: __DEV__,
|
|
78
|
-
debug: __DEV__, // Enable debug logging
|
|
79
|
-
errorHandler: analyticsException,
|
|
80
|
-
|
|
81
|
-
// Add RudderStack configuration
|
|
82
|
-
rudderstack: {
|
|
83
|
-
enabled: true, // Enable RudderStack
|
|
84
|
-
// Optional: If not provided, uses default values from library
|
|
85
|
-
// writeKey: process.env.EXPO_PUBLIC_RUDDERSTACK_WRITE_KEY || '',
|
|
86
|
-
// dataPlaneUrl: process.env.EXPO_PUBLIC_RUDDERSTACK_DATA_PLANE_URL || '',
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
// Initialize analytics
|
|
91
|
-
await analyticsWrapper.initAnalytics();
|
|
92
|
-
|
|
93
|
-
export { analyticsWrapper };
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## Step 5: Wrap Your App with AnalyticsProvider (Segment)
|
|
97
|
-
|
|
98
|
-
If you're using Segment's `AnalyticsProvider`, continue using it:
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
// App.tsx or _layout.tsx
|
|
102
|
-
import { AnalyticsProvider } from 'fleek-track-analytics/lib/segment-exports';
|
|
103
|
-
import { analyticsWrapper } from './analytics';
|
|
104
|
-
|
|
105
|
-
export default function App() {
|
|
106
|
-
return (
|
|
107
|
-
<AnalyticsProvider client={analyticsWrapper.reactNativeSegmentClient}>
|
|
108
|
-
{/* Your app components */}
|
|
109
|
-
</AnalyticsProvider>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**Note**: RudderStack doesn't require a Provider (it uses a singleton pattern), so only Segment needs the Provider.
|
|
115
|
-
|
|
116
|
-
## Step 6: Test Event Tracking
|
|
117
|
-
|
|
118
|
-
Test that events are being sent to both Segment and RudderStack:
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
import { analyticsWrapper } from './analytics';
|
|
122
|
-
|
|
123
|
-
// Test identify
|
|
124
|
-
await analyticsWrapper.identify('test-user-123', {
|
|
125
|
-
email: 'test@example.com',
|
|
126
|
-
name: 'Test User',
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
// Test track event
|
|
130
|
-
await analyticsWrapper.track('test_event', {
|
|
131
|
-
property1: 'value1',
|
|
132
|
-
property2: 'value2',
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
// Test screen
|
|
136
|
-
await analyticsWrapper.screen('TestScreen', {
|
|
137
|
-
screen_name: 'TestScreen',
|
|
138
|
-
category: 'testing',
|
|
139
|
-
});
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## Step 7: Verify Events in RudderStack
|
|
143
|
-
|
|
144
|
-
1. **Check RudderStack Dashboard**:
|
|
145
|
-
|
|
146
|
-
- Go to your RudderStack control plane
|
|
147
|
-
- Navigate to Live Events or Debugger
|
|
148
|
-
- Verify events are being received
|
|
149
|
-
|
|
150
|
-
2. **Check Event Routing**:
|
|
151
|
-
- Only events in `rudderstack-event-routing.ts` should be sent to RudderStack
|
|
152
|
-
- Currently configured events: `identify`, `screen`, `product_detail_page_viewed`, `homescreen`, `homescreen_viewed`, `product_tile_clicked`, `session_started`, `collection_viewed`
|
|
153
|
-
|
|
154
|
-
## Step 8: Debugging
|
|
155
|
-
|
|
156
|
-
### Enable Debug Logging
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
const analyticsWrapper = new TrackAnalytics({
|
|
160
|
-
// ... other config
|
|
161
|
-
debug: true, // Enable debug mode
|
|
162
|
-
});
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Check Initialization Status
|
|
166
|
-
|
|
167
|
-
```typescript
|
|
168
|
-
// After initAnalytics()
|
|
169
|
-
console.log('Segment Client:', analyticsWrapper.reactNativeSegmentClient);
|
|
170
|
-
// RudderStack is a singleton, so no client to expose
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Verify Dual-Send
|
|
174
|
-
|
|
175
|
-
- Check Segment dashboard - all events should appear
|
|
176
|
-
- Check RudderStack dashboard - only routed events should appear
|
|
177
|
-
- Both should work independently (failures in one don't affect the other)
|
|
178
|
-
|
|
179
|
-
## Important Notes
|
|
180
|
-
|
|
181
|
-
### OTA Updates vs Full Release
|
|
182
|
-
|
|
183
|
-
- **Initial Integration**: Requires **full app store release** (native dependencies)
|
|
184
|
-
- **After Initial Release**: Event routing config changes can be deployed via OTA (JavaScript only)
|
|
185
|
-
|
|
186
|
-
### Default Configuration
|
|
187
|
-
|
|
188
|
-
- If `writeKey` and `dataPlaneUrl` are not provided, the library uses defaults:
|
|
189
|
-
- `dataPlaneUrl`: `https://rudderstack.joinfleek.com`
|
|
190
|
-
- `writeKey`: `37NdqKQQY295HrNiIdLWniUMmKU` (from your config)
|
|
191
|
-
|
|
192
|
-
### Event Routing
|
|
193
|
-
|
|
194
|
-
- Event routing is controlled **internally** by the library
|
|
195
|
-
- To modify which events go to RudderStack, edit:
|
|
196
|
-
- `src/react-native/analytics-tool/rudderstack-event-routing.ts` in the library
|
|
197
|
-
- Then rebuild and republish the library
|
|
198
|
-
|
|
199
|
-
### Mutual Exclusivity
|
|
200
|
-
|
|
201
|
-
- Segment and RudderStack initialize independently
|
|
202
|
-
- If Segment fails, RudderStack continues (and vice versa)
|
|
203
|
-
- Events are sent to both SDKs when routing config allows
|
|
204
|
-
|
|
205
|
-
## Troubleshooting
|
|
206
|
-
|
|
207
|
-
### Build Errors
|
|
208
|
-
|
|
209
|
-
```bash
|
|
210
|
-
# If you get native module errors, try:
|
|
211
|
-
npx expo prebuild --clean
|
|
212
|
-
cd ios && pod install && cd ..
|
|
213
|
-
cd android && ./gradlew clean && cd ..
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Events Not Appearing in RudderStack
|
|
217
|
-
|
|
218
|
-
1. Check that `rudderstack.enabled: true` in initialization
|
|
219
|
-
2. Verify the event name is in `rudderstack-event-routing.ts`
|
|
220
|
-
3. Check RudderStack dashboard for any errors
|
|
221
|
-
4. Enable debug mode to see console logs
|
|
222
|
-
|
|
223
|
-
### TypeScript Errors
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
# Clear TypeScript cache
|
|
227
|
-
rm -rf node_modules/.cache
|
|
228
|
-
# Reinstall
|
|
229
|
-
yarn install
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
## Next Steps
|
|
233
|
-
|
|
234
|
-
1. **Test in Development**: Use custom dev client to test locally
|
|
235
|
-
2. **Verify Events**: Check both Segment and RudderStack dashboards
|
|
236
|
-
3. **Gradual Rollout**: Start with limited events (PoC), then expand
|
|
237
|
-
4. **Production Release**: Once validated, release to app stores
|
|
238
|
-
|
|
239
|
-
## Example Complete Setup
|
|
240
|
-
|
|
241
|
-
```typescript
|
|
242
|
-
// analytics.ts
|
|
243
|
-
import { TrackAnalytics } from 'fleek-track-analytics/lib/react-native';
|
|
244
|
-
|
|
245
|
-
const analyticsWrapper = new TrackAnalytics({
|
|
246
|
-
platform: 'REACT_NATIVE',
|
|
247
|
-
App: 'CONSUMER_APP',
|
|
248
|
-
segment: true,
|
|
249
|
-
segmentKey: process.env.EXPO_PUBLIC_SEGMENT_KEY || '',
|
|
250
|
-
devMode: __DEV__,
|
|
251
|
-
debug: __DEV__,
|
|
252
|
-
errorHandler: (e) => {
|
|
253
|
-
if (__DEV__) {
|
|
254
|
-
console.error('[Analytics]', e);
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
rudderstack: {
|
|
258
|
-
enabled: true,
|
|
259
|
-
// Uses defaults if not specified
|
|
260
|
-
},
|
|
261
|
-
});
|
|
262
|
-
|
|
263
|
-
// Initialize
|
|
264
|
-
analyticsWrapper.initAnalytics().catch((error) => {
|
|
265
|
-
console.error('Failed to initialize analytics:', error);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
export { analyticsWrapper };
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
```typescript
|
|
272
|
-
// App.tsx
|
|
273
|
-
import { AnalyticsProvider } from 'fleek-track-analytics/lib/segment-exports';
|
|
274
|
-
import { analyticsWrapper } from './analytics';
|
|
275
|
-
|
|
276
|
-
export default function App() {
|
|
277
|
-
return (
|
|
278
|
-
<AnalyticsProvider client={analyticsWrapper.reactNativeSegmentClient}>
|
|
279
|
-
<YourApp />
|
|
280
|
-
</AnalyticsProvider>
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
```
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { IRNAnalyticsWrapper } from '../track-analytics/track-analytics-types';
|
|
2
|
-
import { tAPP } from '../../track-analytics-types';
|
|
3
|
-
import { DimentionsManger } from '../utils/DImentsionManager/dimension-manager';
|
|
4
|
-
interface IRudderstackRNWrapperParams {
|
|
5
|
-
writeKey: string;
|
|
6
|
-
dataPlaneUrl: string;
|
|
7
|
-
app: tAPP;
|
|
8
|
-
debug?: boolean;
|
|
9
|
-
dimensionsManager: DimentionsManger;
|
|
10
|
-
}
|
|
11
|
-
export declare const reactNativeRudderstack: ({ writeKey, dataPlaneUrl, app, dimensionsManager, }: IRudderstackRNWrapperParams) => Promise<IRNAnalyticsWrapper>;
|
|
12
|
-
export {};
|
|
@@ -1,87 +0,0 @@
|
|
|
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.reactNativeRudderstack = void 0;
|
|
7
|
-
const rudder_sdk_react_native_1 = __importDefault(require("@rudderstack/rudder-sdk-react-native"));
|
|
8
|
-
const package_json_1 = require("../../../package.json");
|
|
9
|
-
let isInitialized = false;
|
|
10
|
-
let currentWriteKey = null;
|
|
11
|
-
let currentDataPlaneUrl = null;
|
|
12
|
-
const reactNativeRudderstack = async ({ writeKey, dataPlaneUrl, app, dimensionsManager, }) => {
|
|
13
|
-
const normalizedDataPlaneUrl = dataPlaneUrl.endsWith('/') ? dataPlaneUrl.slice(0, -1) : dataPlaneUrl;
|
|
14
|
-
if (!isInitialized || currentWriteKey !== writeKey || currentDataPlaneUrl !== normalizedDataPlaneUrl) {
|
|
15
|
-
try {
|
|
16
|
-
await rudder_sdk_react_native_1.default.setup(writeKey, {
|
|
17
|
-
dataPlaneUrl: normalizedDataPlaneUrl,
|
|
18
|
-
trackAppLifecycleEvents: true,
|
|
19
|
-
recordScreenViews: true,
|
|
20
|
-
flushQueueSize: 5,
|
|
21
|
-
sleepTimeOut: 10,
|
|
22
|
-
});
|
|
23
|
-
try {
|
|
24
|
-
await rudder_sdk_react_native_1.default.optOut(false);
|
|
25
|
-
}
|
|
26
|
-
catch (optOutError) {
|
|
27
|
-
}
|
|
28
|
-
isInitialized = true;
|
|
29
|
-
currentWriteKey = writeKey;
|
|
30
|
-
currentDataPlaneUrl = normalizedDataPlaneUrl;
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
throw error;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const trackWrapper = async (eventName, eventParams) => {
|
|
37
|
-
const data = eventParams;
|
|
38
|
-
const eventData = Object.assign(Object.assign({}, data), { anlaytics_lib_version: package_json_1.version, fleek_platform: app, time_stamp: Date.now(), ads_params: dimensionsManager.adsDimensionValues, url_params: dimensionsManager.urlDimensionValues, internetStats: dimensionsManager.internetDimensions });
|
|
39
|
-
console.log('RUDDERSTACK CHECK: [TRACK] eventName:', eventName, 'eventData:', JSON.stringify(eventData));
|
|
40
|
-
try {
|
|
41
|
-
rudder_sdk_react_native_1.default.track(eventName, eventData);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
throw error;
|
|
45
|
-
}
|
|
46
|
-
return Promise.resolve();
|
|
47
|
-
};
|
|
48
|
-
const screenWrapper = async (name, options) => {
|
|
49
|
-
const screenData = Object.assign(Object.assign({}, (options || {})), { anlaytics_lib_version: package_json_1.version, fleek_platform: app, time_stamp: Date.now(), ads_params: dimensionsManager.adsDimensionValues, url_params: dimensionsManager.urlDimensionValues, internetStats: dimensionsManager.internetDimensions });
|
|
50
|
-
console.log('RUDDERSTACK CHECK: [SCREEN] name:', name, 'screenData:', JSON.stringify(screenData));
|
|
51
|
-
try {
|
|
52
|
-
rudder_sdk_react_native_1.default.screen(name, screenData);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
return Promise.resolve();
|
|
58
|
-
};
|
|
59
|
-
const identifyWrapper = async (id, traits) => {
|
|
60
|
-
const traitsObj = traits || {};
|
|
61
|
-
const options = {};
|
|
62
|
-
console.log('RUDDERSTACK CHECK: [IDENTIFY] id:', id, 'traits:', JSON.stringify(traits));
|
|
63
|
-
try {
|
|
64
|
-
if (id) {
|
|
65
|
-
await rudder_sdk_react_native_1.default.identify(id, traitsObj, options);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
await rudder_sdk_react_native_1.default.identify(traitsObj, options);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
const getUserId = () => {
|
|
76
|
-
return '';
|
|
77
|
-
};
|
|
78
|
-
return {
|
|
79
|
-
track: trackWrapper,
|
|
80
|
-
screen: screenWrapper,
|
|
81
|
-
identify: identifyWrapper,
|
|
82
|
-
type: 'RN_RUDDERSTACK',
|
|
83
|
-
getUserId,
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
|
-
exports.reactNativeRudderstack = reactNativeRudderstack;
|
|
87
|
-
//# sourceMappingURL=react-native-rudderstack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-native-rudderstack.js","sourceRoot":"","sources":["../../../src/react-native/analytics-tool/react-native-rudderstack.ts"],"names":[],"mappings":"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"}
|