@driveflux/web-analytics 1.2.0 → 1.3.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.
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1,11 @@
1
+ type Config = {
2
+ ga: {
3
+ measurementId: string;
4
+ apiSecret: string;
5
+ };
6
+ };
7
+ export declare let config: Config;
8
+ export declare const resetConfig: () => Config;
9
+ export declare const setConfig: <Key extends keyof Config>(key: Key, value: Config[Key]) => void;
10
+ export {};
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG;IACb,EAAE,EAAE;QACH,aAAa,EAAE,MAAM,CAAA;QACrB,SAAS,EAAE,MAAM,CAAA;KACjB,CAAA;CACD,CAAA;AASD,eAAO,IAAI,MAAM,EAAE,MAAqD,CAAA;AAExE,eAAO,MAAM,WAAW,cAGvB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,GAAG,SAAS,MAAM,MAAM,OAC5C,GAAG,SACD,MAAM,CAAC,GAAG,CAAC,SAGlB,CAAA"}
package/dist/config.js ADDED
@@ -0,0 +1,17 @@
1
+ import { singleton } from '@driveflux/singleton';
2
+ var getConfig = function() {
3
+ return {
4
+ ga: {
5
+ measurementId: process.env.GA_MEASUREMENT_ID,
6
+ apiSecret: process.env.GA_API_SECRET
7
+ }
8
+ };
9
+ };
10
+ export var config = singleton('webAnalyticsConfig', getConfig());
11
+ export var resetConfig = function() {
12
+ config = singleton('webAnalyticsConfig', getConfig(), true);
13
+ return config;
14
+ };
15
+ export var setConfig = function(key, value) {
16
+ config[key] = value;
17
+ };
@@ -0,0 +1,9 @@
1
+ export * from './config.js';
2
+ import type { JsonObject } from 'type-fest';
3
+ import type { ServerUserData } from './types.js';
4
+ export declare const trackServerMultiple: (user: ServerUserData, events: {
5
+ name: string;
6
+ data?: JsonObject;
7
+ }[]) => Promise<void>;
8
+ export declare const trackServer: (user: ServerUserData, name: string, data?: JsonObject) => Promise<void>;
9
+ //# sourceMappingURL=track-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track-server.d.ts","sourceRoot":"","sources":["../src/track-server.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAE3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAQhD,eAAO,MAAM,mBAAmB,SACzB,cAAc,UACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,EAAE,kBAuE7C,CAAA;AAED,eAAO,MAAM,WAAW,SACjB,cAAc,QACd,MAAM,SACL,UAAU,kBAC8B,CAAA"}
@@ -0,0 +1,299 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _define_property(obj, key, value) {
31
+ if (key in obj) {
32
+ Object.defineProperty(obj, key, {
33
+ value: value,
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true
37
+ });
38
+ } else {
39
+ obj[key] = value;
40
+ }
41
+ return obj;
42
+ }
43
+ function _object_spread(target) {
44
+ for(var i = 1; i < arguments.length; i++){
45
+ var source = arguments[i] != null ? arguments[i] : {};
46
+ var ownKeys = Object.keys(source);
47
+ if (typeof Object.getOwnPropertySymbols === "function") {
48
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
49
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
50
+ }));
51
+ }
52
+ ownKeys.forEach(function(key) {
53
+ _define_property(target, key, source[key]);
54
+ });
55
+ }
56
+ return target;
57
+ }
58
+ function ownKeys(object, enumerableOnly) {
59
+ var keys = Object.keys(object);
60
+ if (Object.getOwnPropertySymbols) {
61
+ var symbols = Object.getOwnPropertySymbols(object);
62
+ if (enumerableOnly) {
63
+ symbols = symbols.filter(function(sym) {
64
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
65
+ });
66
+ }
67
+ keys.push.apply(keys, symbols);
68
+ }
69
+ return keys;
70
+ }
71
+ function _object_spread_props(target, source) {
72
+ source = source != null ? source : {};
73
+ if (Object.getOwnPropertyDescriptors) {
74
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
75
+ } else {
76
+ ownKeys(Object(source)).forEach(function(key) {
77
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
78
+ });
79
+ }
80
+ return target;
81
+ }
82
+ function _ts_generator(thisArg, body) {
83
+ var f, y, t, g, _ = {
84
+ label: 0,
85
+ sent: function() {
86
+ if (t[0] & 1) throw t[1];
87
+ return t[1];
88
+ },
89
+ trys: [],
90
+ ops: []
91
+ };
92
+ return g = {
93
+ next: verb(0),
94
+ "throw": verb(1),
95
+ "return": verb(2)
96
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
97
+ return this;
98
+ }), g;
99
+ function verb(n) {
100
+ return function(v) {
101
+ return step([
102
+ n,
103
+ v
104
+ ]);
105
+ };
106
+ }
107
+ function step(op) {
108
+ if (f) throw new TypeError("Generator is already executing.");
109
+ while(_)try {
110
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
111
+ if (y = 0, t) op = [
112
+ op[0] & 2,
113
+ t.value
114
+ ];
115
+ switch(op[0]){
116
+ case 0:
117
+ case 1:
118
+ t = op;
119
+ break;
120
+ case 4:
121
+ _.label++;
122
+ return {
123
+ value: op[1],
124
+ done: false
125
+ };
126
+ case 5:
127
+ _.label++;
128
+ y = op[1];
129
+ op = [
130
+ 0
131
+ ];
132
+ continue;
133
+ case 7:
134
+ op = _.ops.pop();
135
+ _.trys.pop();
136
+ continue;
137
+ default:
138
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
139
+ _ = 0;
140
+ continue;
141
+ }
142
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
143
+ _.label = op[1];
144
+ break;
145
+ }
146
+ if (op[0] === 6 && _.label < t[1]) {
147
+ _.label = t[1];
148
+ t = op;
149
+ break;
150
+ }
151
+ if (t && _.label < t[2]) {
152
+ _.label = t[2];
153
+ _.ops.push(op);
154
+ break;
155
+ }
156
+ if (t[2]) _.ops.pop();
157
+ _.trys.pop();
158
+ continue;
159
+ }
160
+ op = body.call(thisArg, _);
161
+ } catch (e) {
162
+ op = [
163
+ 6,
164
+ e
165
+ ];
166
+ y = 0;
167
+ } finally{
168
+ f = t = 0;
169
+ }
170
+ if (op[0] & 5) throw op[1];
171
+ return {
172
+ value: op[0] ? op[1] : void 0,
173
+ done: true
174
+ };
175
+ }
176
+ }
177
+ export * from './config.js';
178
+ import { enhancedFetch } from '@driveflux/fetch';
179
+ import { config } from './config';
180
+ import { convertUserData, extractGA4ClientId, extractGA4SessionId, getCurrentTimestampMicros } from './utils.js';
181
+ export var trackServerMultiple = function() {
182
+ var _ref = _async_to_generator(function(user, events) {
183
+ var filtered, _events_, _events_1, _events_2, measurementId, apiSecret, clientId, sessionId, userData, _tmp, _tmp1, url, payload;
184
+ return _ts_generator(this, function(_state) {
185
+ switch(_state.label){
186
+ case 0:
187
+ if (events.length > 1) {
188
+ console.log('🚨🚨🚨🗄️ firing multiple server events', events);
189
+ filtered = events.filter(function(e) {
190
+ return !!e.name;
191
+ });
192
+ if (filtered.length !== events.length) {
193
+ console.log('Not all events have names');
194
+ return [
195
+ 2
196
+ ];
197
+ }
198
+ } else {
199
+ ;
200
+ console.log('🚨🚨🚨🗄️ firing server event', events === null || events === void 0 ? void 0 : (_events_ = events[0]) === null || _events_ === void 0 ? void 0 : _events_.name, events === null || events === void 0 ? void 0 : (_events_1 = events[0]) === null || _events_1 === void 0 ? void 0 : _events_1.data);
201
+ if (!(events === null || events === void 0 ? void 0 : (_events_2 = events[0]) === null || _events_2 === void 0 ? void 0 : _events_2.name)) {
202
+ console.error('The name of the event is missing');
203
+ return [
204
+ 2
205
+ ];
206
+ }
207
+ }
208
+ measurementId = config.ga.measurementId;
209
+ apiSecret = config.ga.apiSecret;
210
+ if (!measurementId || !apiSecret) {
211
+ console.log('The configuration is not set up correctly.');
212
+ return [
213
+ 2
214
+ ];
215
+ }
216
+ clientId = extractGA4ClientId(user.clientIdCookie);
217
+ sessionId = extractGA4SessionId(user.sessionIdCookie);
218
+ if (!clientId || !sessionId) {
219
+ console.log('The user client id or session id are not provided');
220
+ return [
221
+ 2
222
+ ];
223
+ }
224
+ if (!user.data) return [
225
+ 3,
226
+ 2
227
+ ];
228
+ _tmp1 = {};
229
+ return [
230
+ 4,
231
+ convertUserData(user.data)
232
+ ];
233
+ case 1:
234
+ _tmp = (_tmp1.user_data = _state.sent(), _tmp1);
235
+ return [
236
+ 3,
237
+ 3
238
+ ];
239
+ case 2:
240
+ _tmp = {};
241
+ _state.label = 3;
242
+ case 3:
243
+ userData = _tmp;
244
+ url = "https://www.google-analytics.com/mp/collect?measurement_id=".concat(measurementId, "&api_secret=").concat(apiSecret);
245
+ payload = {
246
+ client_id: clientId,
247
+ timestamp_micros: getCurrentTimestampMicros(),
248
+ events: events.map(function(e) {
249
+ if (e.name) {
250
+ return {
251
+ name: e.name,
252
+ params: _object_spread_props(_object_spread({}, userData, e.data), {
253
+ session_id: sessionId
254
+ })
255
+ };
256
+ }
257
+ return null;
258
+ })
259
+ };
260
+ return [
261
+ 4,
262
+ enhancedFetch(url, {
263
+ method: 'POST',
264
+ headers: {
265
+ 'Content-Type': 'application/json'
266
+ },
267
+ body: JSON.stringify(payload)
268
+ })
269
+ ];
270
+ case 4:
271
+ _state.sent();
272
+ return [
273
+ 2
274
+ ];
275
+ }
276
+ });
277
+ });
278
+ return function trackServerMultiple(user, events) {
279
+ return _ref.apply(this, arguments);
280
+ };
281
+ }();
282
+ export var trackServer = function() {
283
+ var _ref = _async_to_generator(function(user, name, data) {
284
+ return _ts_generator(this, function(_state) {
285
+ return [
286
+ 2,
287
+ trackServerMultiple(user, [
288
+ {
289
+ name: name,
290
+ data: data
291
+ }
292
+ ])
293
+ ];
294
+ });
295
+ });
296
+ return function trackServer(user, name, data) {
297
+ return _ref.apply(this, arguments);
298
+ };
299
+ }();
package/dist/track.d.ts CHANGED
@@ -1,29 +1,10 @@
1
+ import type { UserLikeData } from './types';
1
2
  declare global {
2
3
  interface Window {
3
4
  fluxDataLayer?: object[];
4
5
  }
5
6
  }
6
7
  type ClearMode = 'clearItems';
7
- interface Address {
8
- name?: string | null;
9
- street1: string;
10
- street2?: string | null;
11
- city: string;
12
- state: string;
13
- country: string;
14
- postalCode: string;
15
- }
16
- interface UserLikeData {
17
- id: string;
18
- email: string;
19
- phoneNumber?: string | null;
20
- firstName?: string | null;
21
- lastName?: string | null;
22
- addresses?: {
23
- home?: Address | null;
24
- billing?: Address | null;
25
- } | null;
26
- }
27
8
  export declare function getGA4ClientId(): string | null;
28
9
  export declare const safeSendGTMEvent: (event: Record<string, any>) => Promise<void>;
29
10
  export declare const useTrackEvent: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAIA,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KACxB;CACD;AAED,KAAK,SAAS,GAAG,YAAY,CAAA;AAE7B,UAAU,OAAO;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,YAAY;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KACxB,GAAG,IAAI,CAAA;CACR;AA6BD,wBAAgB,cAAc,kBAc7B;AAuCD,eAAO,MAAM,gBAAgB,UAAiB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,kBAOhE,CAAA;AAED,eAAO,MAAM,aAAa;uBAKZ,MAAM,cACL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,cACnB,SAAS;6BA4B2B,YAAY;CAkC9D,CAAA;AAED,eAAO,MAAM,iBAAiB,cAClB,MAAM,cACL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAmC/B,CAAA"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,YAAY,EAAE,MAAM,SAAS,CAAA;AAG7D,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;KACxB;CACD;AAED,KAAK,SAAS,GAAG,YAAY,CAAA;AAa7B,wBAAgB,cAAc,kBAW7B;AAED,eAAO,MAAM,gBAAgB,UAAiB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,kBAOhE,CAAA;AAED,eAAO,MAAM,aAAa;uBAKZ,MAAM,cACL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,cACnB,SAAS;6BA4B2B,YAAY;CAkC9D,CAAA;AAED,eAAO,MAAM,iBAAiB,cAClB,MAAM,cACL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAmC/B,CAAA"}
package/dist/track.js CHANGED
@@ -178,7 +178,7 @@ function _ts_generator(thisArg, body) {
178
178
  import { sendGTMEvent } from '@next/third-parties/google';
179
179
  import isEqual from 'lodash/isEqual.js';
180
180
  import { useCallback, useEffect, useRef } from 'react';
181
- //dataLayer.push({ items: undefined })
181
+ import { convertUserData, extractGA4ClientId } from './utils';
182
182
  var eventsQueue = new Set();
183
183
  var TIMEOUT_TO_CLEAR_EVENTS = 500;
184
184
  var drainEvents = function() {
@@ -214,147 +214,11 @@ export function getGA4ClientId() {
214
214
  return cookie.trim().startsWith('_ga=');
215
215
  });
216
216
  if (gaCookie) {
217
- var matches = gaCookie.split('.');
218
- if (matches.length > 2) {
219
- return "".concat(matches[2], ".").concat(matches[3]) // Returns the GA4 client ID
220
- ;
221
- }
217
+ return extractGA4ClientId(gaCookie);
222
218
  }
223
219
  return null // If no GA cookie is found or format is unexpected
224
220
  ;
225
221
  }
226
- function hashData(input) {
227
- return _hashData.apply(this, arguments);
228
- }
229
- function _hashData() {
230
- _hashData = _async_to_generator(function(input) {
231
- var encoder, data, hashBuffer, hashArray, hashHex;
232
- return _ts_generator(this, function(_state) {
233
- switch(_state.label){
234
- case 0:
235
- encoder = new TextEncoder();
236
- data = encoder.encode(input);
237
- return [
238
- 4,
239
- crypto.subtle.digest('SHA-256', data)
240
- ];
241
- case 1:
242
- hashBuffer = _state.sent();
243
- hashArray = Array.from(new Uint8Array(hashBuffer)) // Convert buffer to byte array
244
- ;
245
- hashHex = hashArray.map(function(b) {
246
- return b.toString(16).padStart(2, '0');
247
- }).join('') // Convert bytes to hex string
248
- ;
249
- return [
250
- 2,
251
- hashHex
252
- ];
253
- }
254
- });
255
- });
256
- return _hashData.apply(this, arguments);
257
- }
258
- var convertUserData = function() {
259
- var _ref = _async_to_generator(function(dataInput) {
260
- var _dataInput_addresses, _dataInput_addresses1, userAddress, _tmp, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5;
261
- return _ts_generator(this, function(_state) {
262
- switch(_state.label){
263
- case 0:
264
- userAddress = ((_dataInput_addresses = dataInput.addresses) === null || _dataInput_addresses === void 0 ? void 0 : _dataInput_addresses.home) || ((_dataInput_addresses1 = dataInput.addresses) === null || _dataInput_addresses1 === void 0 ? void 0 : _dataInput_addresses1.billing);
265
- _tmp = {
266
- user_id: dataInput.id
267
- };
268
- return [
269
- 4,
270
- hashData(dataInput.email)
271
- ];
272
- case 1:
273
- _tmp.email = _state.sent();
274
- if (!dataInput.phoneNumber) return [
275
- 3,
276
- 3
277
- ];
278
- return [
279
- 4,
280
- hashData(dataInput.phoneNumber)
281
- ];
282
- case 2:
283
- _tmp1 = _state.sent();
284
- return [
285
- 3,
286
- 4
287
- ];
288
- case 3:
289
- _tmp1 = undefined;
290
- _state.label = 4;
291
- case 4:
292
- _tmp.phone_number = _tmp1;
293
- if (!userAddress) return [
294
- 3,
295
- 11
296
- ];
297
- _tmp3 = {};
298
- if (!dataInput.firstName) return [
299
- 3,
300
- 6
301
- ];
302
- return [
303
- 4,
304
- hashData(dataInput.firstName)
305
- ];
306
- case 5:
307
- _tmp4 = _state.sent();
308
- return [
309
- 3,
310
- 7
311
- ];
312
- case 6:
313
- _tmp4 = undefined;
314
- _state.label = 7;
315
- case 7:
316
- _tmp3.first_name = _tmp4;
317
- if (!dataInput.lastName) return [
318
- 3,
319
- 9
320
- ];
321
- return [
322
- 4,
323
- hashData(dataInput.lastName)
324
- ];
325
- case 8:
326
- _tmp5 = _state.sent();
327
- return [
328
- 3,
329
- 10
330
- ];
331
- case 9:
332
- _tmp5 = undefined;
333
- _state.label = 10;
334
- case 10:
335
- _tmp2 = (_tmp3.last_name = _tmp5, _tmp3.street = [
336
- userAddress.street1,
337
- userAddress.street2
338
- ].join(', '), _tmp3.city = userAddress.city, _tmp3.region = userAddress.state, _tmp3.postal_code = userAddress.postalCode, _tmp3.country = userAddress.country, _tmp3);
339
- return [
340
- 3,
341
- 12
342
- ];
343
- case 11:
344
- _tmp2 = undefined;
345
- _state.label = 12;
346
- case 12:
347
- return [
348
- 2,
349
- (_tmp.address = _tmp2, _tmp)
350
- ];
351
- }
352
- });
353
- });
354
- return function convertUserData(dataInput) {
355
- return _ref.apply(this, arguments);
356
- };
357
- }();
358
222
  export var safeSendGTMEvent = function() {
359
223
  var _ref = _async_to_generator(function(event) {
360
224
  return _ts_generator(this, function(_state) {
@@ -0,0 +1,40 @@
1
+ export interface Address {
2
+ name?: string | null;
3
+ street1: string;
4
+ street2?: string | null;
5
+ city: string;
6
+ state: string;
7
+ country: string;
8
+ postalCode: string;
9
+ }
10
+ export interface UserLikeData {
11
+ id: string;
12
+ email: string;
13
+ phoneNumber?: string | null;
14
+ firstName?: string | null;
15
+ lastName?: string | null;
16
+ addresses?: {
17
+ home?: Address | null;
18
+ billing?: Address | null;
19
+ } | null;
20
+ }
21
+ export interface TrackingUserData {
22
+ user_id: string;
23
+ email: string;
24
+ phone_number?: string;
25
+ address?: {
26
+ first_name?: string;
27
+ last_name?: string;
28
+ street?: string;
29
+ city?: string;
30
+ region?: string;
31
+ postal_code?: string;
32
+ country?: string;
33
+ };
34
+ }
35
+ export interface ServerUserData {
36
+ clientIdCookie: string;
37
+ sessionIdCookie: string;
38
+ data?: UserLikeData;
39
+ }
40
+ //# 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,OAAO;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KACxB,GAAG,IAAI,CAAA;CACR;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,OAAO,CAAC,EAAE,MAAM,CAAA;KAChB,CAAA;CACD;AAED,MAAM,WAAW,cAAc;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,YAAY,CAAA;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,7 @@
1
+ import type { TrackingUserData, UserLikeData } from './types';
2
+ export declare function hashData(input: string): Promise<string>;
3
+ export declare const getCurrentTimestampMicros: () => string;
4
+ export declare const extractGA4ClientId: (gaCookie: string) => string | null;
5
+ export declare const extractGA4SessionId: (gaCookie: string) => number | null;
6
+ export declare const convertUserData: (dataInput: UserLikeData) => Promise<TrackingUserData>;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE7D,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,mBAO3C;AAED,eAAO,MAAM,yBAAyB,QAAO,MAK5C,CAAA;AAED,eAAO,MAAM,kBAAkB,aAAc,MAAM,kBAMlD,CAAA;AAED,eAAO,MAAM,mBAAmB,aAAc,MAAM,kBAMnD,CAAA;AAED,eAAO,MAAM,eAAe,cAChB,YAAY,KACrB,OAAO,CAAC,gBAAgB,CAwB1B,CAAA"}
package/dist/utils.js ADDED
@@ -0,0 +1,276 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _ts_generator(thisArg, body) {
31
+ var f, y, t, g, _ = {
32
+ label: 0,
33
+ sent: function() {
34
+ if (t[0] & 1) throw t[1];
35
+ return t[1];
36
+ },
37
+ trys: [],
38
+ ops: []
39
+ };
40
+ return g = {
41
+ next: verb(0),
42
+ "throw": verb(1),
43
+ "return": verb(2)
44
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
45
+ return this;
46
+ }), g;
47
+ function verb(n) {
48
+ return function(v) {
49
+ return step([
50
+ n,
51
+ v
52
+ ]);
53
+ };
54
+ }
55
+ function step(op) {
56
+ if (f) throw new TypeError("Generator is already executing.");
57
+ while(_)try {
58
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
59
+ if (y = 0, t) op = [
60
+ op[0] & 2,
61
+ t.value
62
+ ];
63
+ switch(op[0]){
64
+ case 0:
65
+ case 1:
66
+ t = op;
67
+ break;
68
+ case 4:
69
+ _.label++;
70
+ return {
71
+ value: op[1],
72
+ done: false
73
+ };
74
+ case 5:
75
+ _.label++;
76
+ y = op[1];
77
+ op = [
78
+ 0
79
+ ];
80
+ continue;
81
+ case 7:
82
+ op = _.ops.pop();
83
+ _.trys.pop();
84
+ continue;
85
+ default:
86
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
87
+ _ = 0;
88
+ continue;
89
+ }
90
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
91
+ _.label = op[1];
92
+ break;
93
+ }
94
+ if (op[0] === 6 && _.label < t[1]) {
95
+ _.label = t[1];
96
+ t = op;
97
+ break;
98
+ }
99
+ if (t && _.label < t[2]) {
100
+ _.label = t[2];
101
+ _.ops.push(op);
102
+ break;
103
+ }
104
+ if (t[2]) _.ops.pop();
105
+ _.trys.pop();
106
+ continue;
107
+ }
108
+ op = body.call(thisArg, _);
109
+ } catch (e) {
110
+ op = [
111
+ 6,
112
+ e
113
+ ];
114
+ y = 0;
115
+ } finally{
116
+ f = t = 0;
117
+ }
118
+ if (op[0] & 5) throw op[1];
119
+ return {
120
+ value: op[0] ? op[1] : void 0,
121
+ done: true
122
+ };
123
+ }
124
+ }
125
+ export function hashData(input) {
126
+ return _hashData.apply(this, arguments);
127
+ }
128
+ function _hashData() {
129
+ _hashData = _async_to_generator(function(input) {
130
+ var encoder, data, hashBuffer, hashArray, hashHex;
131
+ return _ts_generator(this, function(_state) {
132
+ switch(_state.label){
133
+ case 0:
134
+ encoder = new TextEncoder();
135
+ data = encoder.encode(input);
136
+ return [
137
+ 4,
138
+ crypto.subtle.digest('SHA-256', data)
139
+ ];
140
+ case 1:
141
+ hashBuffer = _state.sent();
142
+ hashArray = Array.from(new Uint8Array(hashBuffer)) // Convert buffer to byte array
143
+ ;
144
+ hashHex = hashArray.map(function(b) {
145
+ return b.toString(16).padStart(2, '0');
146
+ }).join('') // Convert bytes to hex string
147
+ ;
148
+ return [
149
+ 2,
150
+ hashHex
151
+ ];
152
+ }
153
+ });
154
+ });
155
+ return _hashData.apply(this, arguments);
156
+ }
157
+ export var getCurrentTimestampMicros = function() {
158
+ var now = new Date();
159
+ var epochMillis = now.getTime();
160
+ var epochMicros = epochMillis * 1000;
161
+ return epochMicros.toString();
162
+ };
163
+ export var extractGA4ClientId = function(gaCookie) {
164
+ var matches = gaCookie.split('.');
165
+ if (matches.length > 2) {
166
+ return "".concat(matches[2], ".").concat(matches[3]);
167
+ }
168
+ return null;
169
+ };
170
+ export var extractGA4SessionId = function(gaCookie) {
171
+ var matches = gaCookie.split('.');
172
+ if (matches.length > 2) {
173
+ return Number.parseInt("".concat(matches[2]));
174
+ }
175
+ return null;
176
+ };
177
+ export var convertUserData = function() {
178
+ var _ref = _async_to_generator(function(dataInput) {
179
+ var _dataInput_addresses, _dataInput_addresses1, userAddress, _tmp, _tmp1, _tmp2, _tmp3, _tmp4, _tmp5;
180
+ return _ts_generator(this, function(_state) {
181
+ switch(_state.label){
182
+ case 0:
183
+ userAddress = ((_dataInput_addresses = dataInput.addresses) === null || _dataInput_addresses === void 0 ? void 0 : _dataInput_addresses.home) || ((_dataInput_addresses1 = dataInput.addresses) === null || _dataInput_addresses1 === void 0 ? void 0 : _dataInput_addresses1.billing);
184
+ _tmp = {
185
+ user_id: dataInput.id
186
+ };
187
+ return [
188
+ 4,
189
+ hashData(dataInput.email)
190
+ ];
191
+ case 1:
192
+ _tmp.email = _state.sent();
193
+ if (!dataInput.phoneNumber) return [
194
+ 3,
195
+ 3
196
+ ];
197
+ return [
198
+ 4,
199
+ hashData(dataInput.phoneNumber)
200
+ ];
201
+ case 2:
202
+ _tmp1 = _state.sent();
203
+ return [
204
+ 3,
205
+ 4
206
+ ];
207
+ case 3:
208
+ _tmp1 = undefined;
209
+ _state.label = 4;
210
+ case 4:
211
+ _tmp.phone_number = _tmp1;
212
+ if (!userAddress) return [
213
+ 3,
214
+ 11
215
+ ];
216
+ _tmp3 = {};
217
+ if (!dataInput.firstName) return [
218
+ 3,
219
+ 6
220
+ ];
221
+ return [
222
+ 4,
223
+ hashData(dataInput.firstName)
224
+ ];
225
+ case 5:
226
+ _tmp4 = _state.sent();
227
+ return [
228
+ 3,
229
+ 7
230
+ ];
231
+ case 6:
232
+ _tmp4 = undefined;
233
+ _state.label = 7;
234
+ case 7:
235
+ _tmp3.first_name = _tmp4;
236
+ if (!dataInput.lastName) return [
237
+ 3,
238
+ 9
239
+ ];
240
+ return [
241
+ 4,
242
+ hashData(dataInput.lastName)
243
+ ];
244
+ case 8:
245
+ _tmp5 = _state.sent();
246
+ return [
247
+ 3,
248
+ 10
249
+ ];
250
+ case 9:
251
+ _tmp5 = undefined;
252
+ _state.label = 10;
253
+ case 10:
254
+ _tmp2 = (_tmp3.last_name = _tmp5, _tmp3.street = [
255
+ userAddress.street1,
256
+ userAddress.street2
257
+ ].join(', '), _tmp3.city = userAddress.city, _tmp3.region = userAddress.state, _tmp3.postal_code = userAddress.postalCode, _tmp3.country = userAddress.country, _tmp3);
258
+ return [
259
+ 3,
260
+ 12
261
+ ];
262
+ case 11:
263
+ _tmp2 = undefined;
264
+ _state.label = 12;
265
+ case 12:
266
+ return [
267
+ 2,
268
+ (_tmp.address = _tmp2, _tmp)
269
+ ];
270
+ }
271
+ });
272
+ });
273
+ return function convertUserData(dataInput) {
274
+ return _ref.apply(this, arguments);
275
+ };
276
+ }();
package/package.json CHANGED
@@ -1,17 +1,23 @@
1
1
  {
2
2
  "name": "@driveflux/web-analytics",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./track": {
7
7
  "types": "./dist/track.d.ts",
8
8
  "import": "./dist/track.js"
9
+ },
10
+ "./track-server": {
11
+ "types": "./dist/track-server.d.ts",
12
+ "import": "./dist/track-server.js"
9
13
  }
10
14
  },
11
15
  "files": [
12
16
  "dist"
13
17
  ],
14
18
  "dependencies": {
19
+ "@driveflux/fetch": "6.2.1",
20
+ "@driveflux/singleton": "1.2.0",
15
21
  "@next/third-parties": "^14.2.5",
16
22
  "lodash": "^4.17.21"
17
23
  },
@@ -25,6 +31,7 @@
25
31
  "@types/react": "^18.3.3",
26
32
  "del-cli": "^5.1.0",
27
33
  "react": "^18.3.1",
34
+ "type-fest": "^4.23.0",
28
35
  "typescript": "^5.5.4"
29
36
  },
30
37
  "peerDependencies": {