@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 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.0.0",
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
  },