@mate-academy/analytics-client 1.0.0 → 1.1.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/dist/index.d.ts +91 -1
- package/dist/index.js +115 -97
- package/package.json +7 -2
package/dist/index.d.ts
CHANGED
|
@@ -35,10 +35,100 @@ interface AmplitudePluginOptions {
|
|
|
35
35
|
}
|
|
36
36
|
declare function createAmplitudePlugin(options: AmplitudePluginOptions): AnalyticsPlugin;
|
|
37
37
|
|
|
38
|
+
interface SourceParams {
|
|
39
|
+
typ: string;
|
|
40
|
+
src: string;
|
|
41
|
+
mdm: string;
|
|
42
|
+
cmp: string;
|
|
43
|
+
cnt: string;
|
|
44
|
+
trm: string;
|
|
45
|
+
ac_id: string;
|
|
46
|
+
cmp_id: string;
|
|
47
|
+
adg_id: string;
|
|
48
|
+
ad_id: string;
|
|
49
|
+
trm_id: string;
|
|
50
|
+
}
|
|
51
|
+
interface ExtraData {
|
|
52
|
+
fd: string;
|
|
53
|
+
ep: string;
|
|
54
|
+
rf: string;
|
|
55
|
+
}
|
|
56
|
+
interface SessionData {
|
|
57
|
+
pgs: string;
|
|
58
|
+
cpg: string;
|
|
59
|
+
sid: string;
|
|
60
|
+
}
|
|
61
|
+
interface UserData {
|
|
62
|
+
vst: string;
|
|
63
|
+
uip: string;
|
|
64
|
+
uag: string;
|
|
65
|
+
}
|
|
66
|
+
interface Sourcebuster {
|
|
67
|
+
init(options: {
|
|
68
|
+
domain: string;
|
|
69
|
+
user_ip?: string;
|
|
70
|
+
}): void;
|
|
71
|
+
get: {
|
|
72
|
+
current: SourceParams;
|
|
73
|
+
current_add: ExtraData;
|
|
74
|
+
first: SourceParams;
|
|
75
|
+
first_add: ExtraData;
|
|
76
|
+
session: SessionData;
|
|
77
|
+
udata: UserData;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
declare global {
|
|
81
|
+
interface Window {
|
|
82
|
+
sbjs?: Sourcebuster;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface ClickIds {
|
|
87
|
+
gclid: string | null;
|
|
88
|
+
gbraid: string | null;
|
|
89
|
+
wbraid: string | null;
|
|
90
|
+
gClientid: string;
|
|
91
|
+
fbc: string | null;
|
|
92
|
+
fbp: string | null;
|
|
93
|
+
fbclid: string | null;
|
|
94
|
+
ttclid: string | null;
|
|
95
|
+
sdclid: string | null;
|
|
96
|
+
ksclid: string | null;
|
|
97
|
+
}
|
|
98
|
+
interface SourceData {
|
|
99
|
+
fvPage: string | null;
|
|
100
|
+
lvPage: string | null;
|
|
101
|
+
lvType: string | null;
|
|
102
|
+
lvSource: string | null;
|
|
103
|
+
lvMedium: string | null;
|
|
104
|
+
lvCampaign: string | null;
|
|
105
|
+
lvContent: string | null;
|
|
106
|
+
lvTerm: string | null;
|
|
107
|
+
lvAccountId: string | null;
|
|
108
|
+
lvCampaignId: string | null;
|
|
109
|
+
lvAdGroupId: string | null;
|
|
110
|
+
lvAdId: string | null;
|
|
111
|
+
lvTermId: string | null;
|
|
112
|
+
}
|
|
113
|
+
interface TrackingData extends SourceData, ClickIds {
|
|
114
|
+
locationIpAddress: string;
|
|
115
|
+
sessionId: string;
|
|
116
|
+
userAgent: string;
|
|
117
|
+
}
|
|
118
|
+
interface TrackingDataOptions {
|
|
119
|
+
sourceTracker: Sourcebuster | undefined;
|
|
120
|
+
sessionId: string;
|
|
121
|
+
}
|
|
122
|
+
declare function getUserIp(): string;
|
|
123
|
+
declare function getTrackingData({ sourceTracker, sessionId, }: TrackingDataOptions): TrackingData;
|
|
124
|
+
declare function getSourceData(sourceTracker: Sourcebuster | undefined): SourceData;
|
|
125
|
+
declare function getClickIds(): ClickIds;
|
|
126
|
+
declare function getFacebookParams(): Pick<ClickIds, 'fbc' | 'fbp' | 'fbclid'>;
|
|
127
|
+
|
|
38
128
|
declare const PLUGIN_NAMES: {
|
|
39
129
|
readonly DWH: "dwh";
|
|
40
130
|
readonly AMPLITUDE: "amplitude";
|
|
41
131
|
};
|
|
42
132
|
type PluginName = typeof PLUGIN_NAMES[keyof typeof PLUGIN_NAMES];
|
|
43
133
|
|
|
44
|
-
export { type AnalyticsPlugin, type DwhErrorContext, PLUGIN_NAMES, type PluginName, createAmplitudePlugin, createDwhPlugin, identify, registerPlugins, reset, track };
|
|
134
|
+
export { type AnalyticsPlugin, type ClickIds, type DwhErrorContext, PLUGIN_NAMES, type PluginName, type SourceData, type Sourcebuster, type TrackingData, type TrackingDataOptions, createAmplitudePlugin, createDwhPlugin, getClickIds, getFacebookParams, getSourceData, getTrackingData, getUserIp, identify, registerPlugins, reset, track };
|
package/dist/index.js
CHANGED
|
@@ -116,6 +116,115 @@ var PLUGIN_NAMES = {
|
|
|
116
116
|
AMPLITUDE: "amplitude"
|
|
117
117
|
};
|
|
118
118
|
|
|
119
|
+
// src/attribution.ts
|
|
120
|
+
var UNKNOWN_USER_AGENT = "unknown";
|
|
121
|
+
function getUserIp() {
|
|
122
|
+
return getCookieValue("_mate-user-ip") || "8.8.8.8";
|
|
123
|
+
}
|
|
124
|
+
function getTrackingData({
|
|
125
|
+
sourceTracker,
|
|
126
|
+
sessionId
|
|
127
|
+
}) {
|
|
128
|
+
return {
|
|
129
|
+
...getSourceData(sourceTracker),
|
|
130
|
+
...getClickIds(),
|
|
131
|
+
locationIpAddress: getUserIp(),
|
|
132
|
+
sessionId,
|
|
133
|
+
userAgent: getUserAgent(sourceTracker)
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
function getSourceData(sourceTracker) {
|
|
137
|
+
if (!sourceTracker) {
|
|
138
|
+
return {
|
|
139
|
+
fvPage: null,
|
|
140
|
+
lvPage: null,
|
|
141
|
+
lvType: null,
|
|
142
|
+
lvSource: null,
|
|
143
|
+
lvMedium: null,
|
|
144
|
+
lvCampaign: null,
|
|
145
|
+
lvContent: null,
|
|
146
|
+
lvTerm: null,
|
|
147
|
+
lvAccountId: null,
|
|
148
|
+
lvCampaignId: null,
|
|
149
|
+
lvAdGroupId: null,
|
|
150
|
+
lvAdId: null,
|
|
151
|
+
lvTermId: null
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const current = sourceTracker.get.current;
|
|
155
|
+
return {
|
|
156
|
+
fvPage: toPageValue(sourceTracker.get.first_add.ep),
|
|
157
|
+
lvPage: toPageValue(sourceTracker.get.current_add.ep),
|
|
158
|
+
lvType: current.typ,
|
|
159
|
+
lvSource: current.src,
|
|
160
|
+
lvMedium: current.mdm,
|
|
161
|
+
lvCampaign: current.cmp,
|
|
162
|
+
lvContent: current.cnt,
|
|
163
|
+
lvTerm: current.trm,
|
|
164
|
+
lvAccountId: current.ac_id,
|
|
165
|
+
lvCampaignId: current.cmp_id,
|
|
166
|
+
lvAdGroupId: current.adg_id,
|
|
167
|
+
lvAdId: current.ad_id,
|
|
168
|
+
lvTermId: current.trm_id
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function getClickIds() {
|
|
172
|
+
const facebookParams = getFacebookParams();
|
|
173
|
+
return {
|
|
174
|
+
gclid: getCookieValue("_mate-gclid"),
|
|
175
|
+
gbraid: getCookieValue("_mate-gbraid"),
|
|
176
|
+
wbraid: getCookieValue("_mate-wbraid"),
|
|
177
|
+
gClientid: getCookieValue("_ga") ?? "0.0",
|
|
178
|
+
fbc: facebookParams.fbc,
|
|
179
|
+
fbp: facebookParams.fbp,
|
|
180
|
+
fbclid: facebookParams.fbclid,
|
|
181
|
+
ttclid: getCookieValue("_mate-ttclid"),
|
|
182
|
+
sdclid: getCookieValue("_mate-sdclid"),
|
|
183
|
+
ksclid: getCookieValue("_mate-ksclid")
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
function getFacebookParams() {
|
|
187
|
+
const fbp = getCookieValue("_fbp");
|
|
188
|
+
let fbc = getCookieValue("_fbc");
|
|
189
|
+
let fbclid = getCookieValue("_mate-fbclid");
|
|
190
|
+
if (fbclid?.includes("https://")) {
|
|
191
|
+
const queryParamsString = fbclid.split("?")[1];
|
|
192
|
+
const queryParams = new URLSearchParams(queryParamsString);
|
|
193
|
+
fbclid = queryParams.get("fbclid") ?? null;
|
|
194
|
+
}
|
|
195
|
+
if (!fbc && fbclid) {
|
|
196
|
+
fbc = `fb.1.${Date.now()}.${fbclid}`;
|
|
197
|
+
}
|
|
198
|
+
if (fbc?.includes("https://")) {
|
|
199
|
+
const queryParamsString = fbc.split("?")[1];
|
|
200
|
+
const fbcTimestamp = fbc.split(".")[2] ?? Date.now().toString();
|
|
201
|
+
const queryParams = new URLSearchParams(queryParamsString);
|
|
202
|
+
fbclid = queryParams.get("fbclid") ?? null;
|
|
203
|
+
fbc = `fb.1.${fbcTimestamp}.${fbclid}`;
|
|
204
|
+
}
|
|
205
|
+
return { fbp, fbc, fbclid };
|
|
206
|
+
}
|
|
207
|
+
function getUserAgent(sourceTracker) {
|
|
208
|
+
if (sourceTracker) {
|
|
209
|
+
return sourceTracker.get.udata.uag;
|
|
210
|
+
}
|
|
211
|
+
if (typeof navigator === "undefined") {
|
|
212
|
+
return UNKNOWN_USER_AGENT;
|
|
213
|
+
}
|
|
214
|
+
return navigator.userAgent;
|
|
215
|
+
}
|
|
216
|
+
function toPageValue(entrancePoint) {
|
|
217
|
+
if (!entrancePoint) {
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const pathname = new URL(entrancePoint).pathname.slice(1);
|
|
222
|
+
return pathname || "home";
|
|
223
|
+
} catch {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
119
228
|
// src/plugins/dwh.ts
|
|
120
229
|
var USER_ANALYTICS_ID_KEY = "_mate-user-analytics-id";
|
|
121
230
|
var USER_SESSION_ID_KEY = "_mate-user-session-id";
|
|
@@ -127,9 +236,6 @@ function createDwhPlugin(options = {}) {
|
|
|
127
236
|
const cookieDomain = options.cookieDomain ?? "mate.academy";
|
|
128
237
|
const onError = options.onError;
|
|
129
238
|
let sourceTracker;
|
|
130
|
-
function getUserIp() {
|
|
131
|
-
return getCookieValue("_mate-user-ip") || "8.8.8.8";
|
|
132
|
-
}
|
|
133
239
|
function getUserId() {
|
|
134
240
|
let fromStorage = null;
|
|
135
241
|
try {
|
|
@@ -163,99 +269,6 @@ function createDwhPlugin(options = {}) {
|
|
|
163
269
|
setCookie(USER_SESSION_ID_KEY, currentSessionId, SESSION_MAX_AGE_SECONDS);
|
|
164
270
|
return { sessionId: currentSessionId, isNewSession: false };
|
|
165
271
|
}
|
|
166
|
-
function getFirstVisitPage() {
|
|
167
|
-
if (!sourceTracker) {
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
const entrancePoint = sourceTracker.get.first_add.ep;
|
|
171
|
-
if (!entrancePoint) {
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
try {
|
|
175
|
-
const pathname = new URL(entrancePoint).pathname.slice(1);
|
|
176
|
-
return pathname || "home";
|
|
177
|
-
} catch {
|
|
178
|
-
return entrancePoint;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
function getSourceData() {
|
|
182
|
-
if (!sourceTracker) {
|
|
183
|
-
return {
|
|
184
|
-
fvPage: null,
|
|
185
|
-
lvType: null,
|
|
186
|
-
lvSource: null,
|
|
187
|
-
lvMedium: null,
|
|
188
|
-
lvCampaign: null,
|
|
189
|
-
lvContent: null,
|
|
190
|
-
lvTerm: null,
|
|
191
|
-
lvAccountId: null,
|
|
192
|
-
lvCampaignId: null,
|
|
193
|
-
lvAdGroupId: null,
|
|
194
|
-
lvAdId: null,
|
|
195
|
-
lvTermId: null
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
const current = sourceTracker.get.current;
|
|
199
|
-
return {
|
|
200
|
-
fvPage: getFirstVisitPage(),
|
|
201
|
-
lvType: current.typ,
|
|
202
|
-
lvSource: current.src,
|
|
203
|
-
lvMedium: current.mdm,
|
|
204
|
-
lvCampaign: current.cmp,
|
|
205
|
-
lvContent: current.cnt,
|
|
206
|
-
lvTerm: current.trm,
|
|
207
|
-
lvAccountId: current.ac_id,
|
|
208
|
-
lvCampaignId: current.cmp_id,
|
|
209
|
-
lvAdGroupId: current.adg_id,
|
|
210
|
-
lvAdId: current.ad_id,
|
|
211
|
-
lvTermId: current.trm_id
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
function getFacebookParams() {
|
|
215
|
-
const fbp = getCookieValue("_fbp");
|
|
216
|
-
let fbc = getCookieValue("_fbc");
|
|
217
|
-
let fbclid = getCookieValue("_mate-fbclid");
|
|
218
|
-
if (fbclid?.includes("https://")) {
|
|
219
|
-
const queryParamsString = fbclid.split("?")[1];
|
|
220
|
-
const queryParams = new URLSearchParams(queryParamsString);
|
|
221
|
-
fbclid = queryParams.get("fbclid") ?? null;
|
|
222
|
-
}
|
|
223
|
-
if (!fbc && fbclid) {
|
|
224
|
-
fbc = `fb.1.${Date.now()}.${fbclid}`;
|
|
225
|
-
}
|
|
226
|
-
if (fbc?.includes("https://")) {
|
|
227
|
-
const queryParamsString = fbc.split("?")[1];
|
|
228
|
-
const fbcTimestamp = fbc.split(".")[2] ?? Date.now().toString();
|
|
229
|
-
const queryParams = new URLSearchParams(queryParamsString);
|
|
230
|
-
fbclid = queryParams.get("fbclid") ?? null;
|
|
231
|
-
fbc = `fb.1.${fbcTimestamp}.${fbclid}`;
|
|
232
|
-
}
|
|
233
|
-
return { fbp, fbc, fbclid };
|
|
234
|
-
}
|
|
235
|
-
function getClickIds() {
|
|
236
|
-
const facebookParams = getFacebookParams();
|
|
237
|
-
return {
|
|
238
|
-
gclid: getCookieValue("_mate-gclid"),
|
|
239
|
-
gbraid: getCookieValue("_mate-gbraid"),
|
|
240
|
-
wbraid: getCookieValue("_mate-wbraid"),
|
|
241
|
-
gClientid: getCookieValue("_ga") ?? "0.0",
|
|
242
|
-
fbc: facebookParams.fbc,
|
|
243
|
-
fbp: facebookParams.fbp,
|
|
244
|
-
fbclid: facebookParams.fbclid,
|
|
245
|
-
ttclid: getCookieValue("_mate-ttclid"),
|
|
246
|
-
sdclid: getCookieValue("_mate-sdclid"),
|
|
247
|
-
ksclid: getCookieValue("_mate-ksclid")
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
function getTrackingData(sessionId) {
|
|
251
|
-
return {
|
|
252
|
-
...getSourceData(),
|
|
253
|
-
...getClickIds(),
|
|
254
|
-
locationIpAddress: getUserIp(),
|
|
255
|
-
sessionId,
|
|
256
|
-
userAgent: sourceTracker ? sourceTracker.get.udata.uag : navigator.userAgent
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
272
|
function sleep(ms) {
|
|
260
273
|
return new Promise((resolve) => {
|
|
261
274
|
setTimeout(resolve, ms);
|
|
@@ -286,7 +299,7 @@ function createDwhPlugin(options = {}) {
|
|
|
286
299
|
const { sessionId, isNewSession } = ensureSessionId();
|
|
287
300
|
const userId = getUserId();
|
|
288
301
|
const deviceId = getOrCreateDeviceId();
|
|
289
|
-
const tracking = getTrackingData(sessionId);
|
|
302
|
+
const tracking = getTrackingData({ sourceTracker, sessionId });
|
|
290
303
|
const basePayload = {
|
|
291
304
|
session_id: sessionId,
|
|
292
305
|
platform_user_id: userId,
|
|
@@ -402,6 +415,11 @@ export {
|
|
|
402
415
|
PLUGIN_NAMES,
|
|
403
416
|
createAmplitudePlugin,
|
|
404
417
|
createDwhPlugin,
|
|
418
|
+
getClickIds,
|
|
419
|
+
getFacebookParams,
|
|
420
|
+
getSourceData,
|
|
421
|
+
getTrackingData,
|
|
422
|
+
getUserIp,
|
|
405
423
|
identify,
|
|
406
424
|
registerPlugins,
|
|
407
425
|
reset,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mate-academy/analytics-client",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Pluggable analytics client for Mate academy external pages",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
"dist/"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "tsup"
|
|
16
|
+
"build": "tsup",
|
|
17
|
+
"type-check": "tsc --noEmit",
|
|
18
|
+
"test": "jest"
|
|
17
19
|
},
|
|
18
20
|
"dependencies": {
|
|
19
21
|
"@amplitude/analytics-browser": "^2.40.0",
|
|
@@ -22,7 +24,10 @@
|
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|
|
24
26
|
"@types/cookie": "^0.6.0",
|
|
27
|
+
"@types/jest": "^30.0.0",
|
|
25
28
|
"@typescript-eslint/parser": "^8.58.1",
|
|
29
|
+
"jest": "^30.4.2",
|
|
30
|
+
"ts-jest": "^29.4.12",
|
|
26
31
|
"tsup": "^8.0.0",
|
|
27
32
|
"typescript": "^5.8.0"
|
|
28
33
|
},
|