@driveflux/web-analytics 1.3.0 → 1.3.1
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/config.js +5 -7
- package/dist/track-server.js +57 -290
- package/dist/track.js +50 -275
- package/dist/utils.js +38 -264
- package/package.json +1 -1
- package/dist/cjs/package.json +0 -3
package/dist/config.js
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { singleton } from '@driveflux/singleton';
|
|
2
|
-
|
|
3
|
-
return {
|
|
2
|
+
const getConfig = ()=>({
|
|
4
3
|
ga: {
|
|
5
4
|
measurementId: process.env.GA_MEASUREMENT_ID,
|
|
6
5
|
apiSecret: process.env.GA_API_SECRET
|
|
7
6
|
}
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export
|
|
11
|
-
export var resetConfig = function() {
|
|
7
|
+
});
|
|
8
|
+
export let config = singleton('webAnalyticsConfig', getConfig());
|
|
9
|
+
export const resetConfig = ()=>{
|
|
12
10
|
config = singleton('webAnalyticsConfig', getConfig(), true);
|
|
13
11
|
return config;
|
|
14
12
|
};
|
|
15
|
-
export
|
|
13
|
+
export const setConfig = (key, value)=>{
|
|
16
14
|
config[key] = value;
|
|
17
15
|
};
|
package/dist/track-server.js
CHANGED
|
@@ -1,299 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
});
|
|
1
|
+
export * from './config.js';
|
|
2
|
+
import { enhancedFetch } from '@driveflux/fetch';
|
|
3
|
+
import { config } from './config';
|
|
4
|
+
import { convertUserData, extractGA4ClientId, extractGA4SessionId, getCurrentTimestampMicros } from './utils.js';
|
|
5
|
+
export const trackServerMultiple = async (user, events)=>{
|
|
6
|
+
if (events.length > 1) {
|
|
7
|
+
console.log('🚨🚨🚨🗄️ firing multiple server events', events);
|
|
8
|
+
const filtered = events.filter((e)=>!!e.name);
|
|
9
|
+
if (filtered.length !== events.length) {
|
|
10
|
+
console.log('Not all events have names');
|
|
11
|
+
return;
|
|
66
12
|
}
|
|
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
13
|
} else {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
14
|
+
console.log('🚨🚨🚨🗄️ firing server event', events?.[0]?.name, events?.[0]?.data);
|
|
15
|
+
if (!events?.[0]?.name) {
|
|
16
|
+
console.error('The name of the event is missing');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
79
19
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
};
|
|
20
|
+
const measurementId = config.ga.measurementId;
|
|
21
|
+
const apiSecret = config.ga.apiSecret;
|
|
22
|
+
if (!measurementId || !apiSecret) {
|
|
23
|
+
console.log('The configuration is not set up correctly.');
|
|
24
|
+
return;
|
|
106
25
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
};
|
|
26
|
+
const clientId = extractGA4ClientId(user.clientIdCookie);
|
|
27
|
+
const sessionId = extractGA4SessionId(user.sessionIdCookie);
|
|
28
|
+
if (!clientId || !sessionId) {
|
|
29
|
+
console.log('The user client id or session id are not provided');
|
|
30
|
+
return;
|
|
175
31
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
];
|
|
32
|
+
const userData = user.data ? {
|
|
33
|
+
user_data: await convertUserData(user.data)
|
|
34
|
+
} : {};
|
|
35
|
+
const url = `https://www.google-analytics.com/mp/collect?measurement_id=${measurementId}&api_secret=${apiSecret}`;
|
|
36
|
+
const payload = {
|
|
37
|
+
client_id: clientId,
|
|
38
|
+
timestamp_micros: getCurrentTimestampMicros(),
|
|
39
|
+
events: events.map((e)=>{
|
|
40
|
+
if (e.name) {
|
|
41
|
+
return {
|
|
42
|
+
name: e.name,
|
|
43
|
+
params: {
|
|
44
|
+
...userData,
|
|
45
|
+
...e.data,
|
|
46
|
+
session_id: sessionId
|
|
215
47
|
}
|
|
216
|
-
|
|
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
|
-
];
|
|
48
|
+
};
|
|
275
49
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
return function trackServerMultiple(user, events) {
|
|
279
|
-
return _ref.apply(this, arguments);
|
|
50
|
+
return null;
|
|
51
|
+
})
|
|
280
52
|
};
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
trackServerMultiple(user, [
|
|
288
|
-
{
|
|
289
|
-
name: name,
|
|
290
|
-
data: data
|
|
291
|
-
}
|
|
292
|
-
])
|
|
293
|
-
];
|
|
294
|
-
});
|
|
53
|
+
await enhancedFetch(url, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Type': 'application/json'
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify(payload)
|
|
295
59
|
});
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
60
|
+
};
|
|
61
|
+
export const trackServer = async (user, name, data)=>trackServerMultiple(user, [
|
|
62
|
+
{
|
|
63
|
+
name,
|
|
64
|
+
data
|
|
65
|
+
}
|
|
66
|
+
]);
|
package/dist/track.js
CHANGED
|
@@ -1,256 +1,52 @@
|
|
|
1
|
-
function _array_like_to_array(arr, len) {
|
|
2
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
-
return arr2;
|
|
5
|
-
}
|
|
6
|
-
function _array_without_holes(arr) {
|
|
7
|
-
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
8
|
-
}
|
|
9
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
10
|
-
try {
|
|
11
|
-
var info = gen[key](arg);
|
|
12
|
-
var value = info.value;
|
|
13
|
-
} catch (error) {
|
|
14
|
-
reject(error);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
if (info.done) {
|
|
18
|
-
resolve(value);
|
|
19
|
-
} else {
|
|
20
|
-
Promise.resolve(value).then(_next, _throw);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function _async_to_generator(fn) {
|
|
24
|
-
return function() {
|
|
25
|
-
var self = this, args = arguments;
|
|
26
|
-
return new Promise(function(resolve, reject) {
|
|
27
|
-
var gen = fn.apply(self, args);
|
|
28
|
-
function _next(value) {
|
|
29
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
30
|
-
}
|
|
31
|
-
function _throw(err) {
|
|
32
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
33
|
-
}
|
|
34
|
-
_next(undefined);
|
|
35
|
-
});
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function _define_property(obj, key, value) {
|
|
39
|
-
if (key in obj) {
|
|
40
|
-
Object.defineProperty(obj, key, {
|
|
41
|
-
value: value,
|
|
42
|
-
enumerable: true,
|
|
43
|
-
configurable: true,
|
|
44
|
-
writable: true
|
|
45
|
-
});
|
|
46
|
-
} else {
|
|
47
|
-
obj[key] = value;
|
|
48
|
-
}
|
|
49
|
-
return obj;
|
|
50
|
-
}
|
|
51
|
-
function _iterable_to_array(iter) {
|
|
52
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
53
|
-
}
|
|
54
|
-
function _non_iterable_spread() {
|
|
55
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
56
|
-
}
|
|
57
|
-
function _object_spread(target) {
|
|
58
|
-
for(var i = 1; i < arguments.length; i++){
|
|
59
|
-
var source = arguments[i] != null ? arguments[i] : {};
|
|
60
|
-
var ownKeys = Object.keys(source);
|
|
61
|
-
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
62
|
-
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
63
|
-
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
64
|
-
}));
|
|
65
|
-
}
|
|
66
|
-
ownKeys.forEach(function(key) {
|
|
67
|
-
_define_property(target, key, source[key]);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
return target;
|
|
71
|
-
}
|
|
72
|
-
function _to_consumable_array(arr) {
|
|
73
|
-
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
74
|
-
}
|
|
75
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
76
|
-
if (!o) return;
|
|
77
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
78
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
79
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
80
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
81
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
82
|
-
}
|
|
83
|
-
function _ts_generator(thisArg, body) {
|
|
84
|
-
var f, y, t, g, _ = {
|
|
85
|
-
label: 0,
|
|
86
|
-
sent: function() {
|
|
87
|
-
if (t[0] & 1) throw t[1];
|
|
88
|
-
return t[1];
|
|
89
|
-
},
|
|
90
|
-
trys: [],
|
|
91
|
-
ops: []
|
|
92
|
-
};
|
|
93
|
-
return g = {
|
|
94
|
-
next: verb(0),
|
|
95
|
-
"throw": verb(1),
|
|
96
|
-
"return": verb(2)
|
|
97
|
-
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
|
|
98
|
-
return this;
|
|
99
|
-
}), g;
|
|
100
|
-
function verb(n) {
|
|
101
|
-
return function(v) {
|
|
102
|
-
return step([
|
|
103
|
-
n,
|
|
104
|
-
v
|
|
105
|
-
]);
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
function step(op) {
|
|
109
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
110
|
-
while(_)try {
|
|
111
|
-
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;
|
|
112
|
-
if (y = 0, t) op = [
|
|
113
|
-
op[0] & 2,
|
|
114
|
-
t.value
|
|
115
|
-
];
|
|
116
|
-
switch(op[0]){
|
|
117
|
-
case 0:
|
|
118
|
-
case 1:
|
|
119
|
-
t = op;
|
|
120
|
-
break;
|
|
121
|
-
case 4:
|
|
122
|
-
_.label++;
|
|
123
|
-
return {
|
|
124
|
-
value: op[1],
|
|
125
|
-
done: false
|
|
126
|
-
};
|
|
127
|
-
case 5:
|
|
128
|
-
_.label++;
|
|
129
|
-
y = op[1];
|
|
130
|
-
op = [
|
|
131
|
-
0
|
|
132
|
-
];
|
|
133
|
-
continue;
|
|
134
|
-
case 7:
|
|
135
|
-
op = _.ops.pop();
|
|
136
|
-
_.trys.pop();
|
|
137
|
-
continue;
|
|
138
|
-
default:
|
|
139
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
140
|
-
_ = 0;
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
144
|
-
_.label = op[1];
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
if (op[0] === 6 && _.label < t[1]) {
|
|
148
|
-
_.label = t[1];
|
|
149
|
-
t = op;
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
if (t && _.label < t[2]) {
|
|
153
|
-
_.label = t[2];
|
|
154
|
-
_.ops.push(op);
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
if (t[2]) _.ops.pop();
|
|
158
|
-
_.trys.pop();
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
op = body.call(thisArg, _);
|
|
162
|
-
} catch (e) {
|
|
163
|
-
op = [
|
|
164
|
-
6,
|
|
165
|
-
e
|
|
166
|
-
];
|
|
167
|
-
y = 0;
|
|
168
|
-
} finally{
|
|
169
|
-
f = t = 0;
|
|
170
|
-
}
|
|
171
|
-
if (op[0] & 5) throw op[1];
|
|
172
|
-
return {
|
|
173
|
-
value: op[0] ? op[1] : void 0,
|
|
174
|
-
done: true
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
1
|
import { sendGTMEvent } from '@next/third-parties/google';
|
|
179
2
|
import isEqual from 'lodash/isEqual.js';
|
|
180
3
|
import { useCallback, useEffect, useRef } from 'react';
|
|
181
4
|
import { convertUserData, extractGA4ClientId } from './utils';
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
5
|
+
const eventsQueue = new Set();
|
|
6
|
+
const TIMEOUT_TO_CLEAR_EVENTS = 500;
|
|
7
|
+
const drainEvents = ()=>{
|
|
8
|
+
const events = [
|
|
9
|
+
...eventsQueue
|
|
10
|
+
];
|
|
186
11
|
eventsQueue.clear();
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
for(var _iterator = events[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
190
|
-
var event = _step.value;
|
|
191
|
-
sendGTMEvent(event);
|
|
192
|
-
}
|
|
193
|
-
} catch (err) {
|
|
194
|
-
_didIteratorError = true;
|
|
195
|
-
_iteratorError = err;
|
|
196
|
-
} finally{
|
|
197
|
-
try {
|
|
198
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
199
|
-
_iterator.return();
|
|
200
|
-
}
|
|
201
|
-
} finally{
|
|
202
|
-
if (_didIteratorError) {
|
|
203
|
-
throw _iteratorError;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
12
|
+
for (const event of events){
|
|
13
|
+
sendGTMEvent(event);
|
|
206
14
|
}
|
|
207
15
|
};
|
|
208
16
|
export function getGA4ClientId() {
|
|
209
17
|
if (typeof document === 'undefined') {
|
|
210
18
|
return null;
|
|
211
19
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return cookie.trim().startsWith('_ga=');
|
|
215
|
-
});
|
|
20
|
+
const cookies = document.cookie.split(';');
|
|
21
|
+
const gaCookie = cookies.find((cookie)=>cookie.trim().startsWith('_ga='));
|
|
216
22
|
if (gaCookie) {
|
|
217
23
|
return extractGA4ClientId(gaCookie);
|
|
218
24
|
}
|
|
219
25
|
return null // If no GA cookie is found or format is unexpected
|
|
220
26
|
;
|
|
221
27
|
}
|
|
222
|
-
export
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
return [
|
|
233
|
-
2
|
|
234
|
-
];
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
return function safeSendGTMEvent(event) {
|
|
238
|
-
return _ref.apply(this, arguments);
|
|
239
|
-
};
|
|
240
|
-
}();
|
|
241
|
-
export var useTrackEvent = function() {
|
|
242
|
-
var userData = useRef();
|
|
243
|
-
var track = useCallback(function(eventName, eventData, clearMode) {
|
|
28
|
+
export const safeSendGTMEvent = async (event)=>{
|
|
29
|
+
if (!window.fluxDataLayer) {
|
|
30
|
+
eventsQueue.add(event);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
sendGTMEvent(event);
|
|
34
|
+
};
|
|
35
|
+
export const useTrackEvent = ()=>{
|
|
36
|
+
const userData = useRef();
|
|
37
|
+
const track = useCallback((eventName, eventData, clearMode)=>{
|
|
244
38
|
console.log('🚨🚨🚨 firing event', eventName, eventData);
|
|
245
39
|
if (!eventName) {
|
|
246
40
|
console.error('No event name provided');
|
|
247
41
|
return;
|
|
248
42
|
}
|
|
249
|
-
|
|
250
|
-
event: eventName
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
43
|
+
const event = {
|
|
44
|
+
event: eventName,
|
|
45
|
+
...userData.current ? {
|
|
46
|
+
user_data: userData.current
|
|
47
|
+
} : {},
|
|
48
|
+
...eventData
|
|
49
|
+
};
|
|
254
50
|
if (clearMode === 'clearItems') {
|
|
255
51
|
safeSendGTMEvent({
|
|
256
52
|
items: undefined
|
|
@@ -258,77 +54,56 @@ export var useTrackEvent = function() {
|
|
|
258
54
|
}
|
|
259
55
|
safeSendGTMEvent(event);
|
|
260
56
|
}, []);
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
4,
|
|
268
|
-
convertUserData(dataInput)
|
|
269
|
-
];
|
|
270
|
-
case 1:
|
|
271
|
-
userData.current = _state.sent();
|
|
272
|
-
localStorage.setItem('ud', Buffer.from(JSON.stringify(userData.current), 'utf8').toString('base64'));
|
|
273
|
-
return [
|
|
274
|
-
2
|
|
275
|
-
];
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
});
|
|
279
|
-
return function(dataInput) {
|
|
280
|
-
return _ref.apply(this, arguments);
|
|
281
|
-
};
|
|
282
|
-
}(), []);
|
|
283
|
-
useEffect(function() {
|
|
284
|
-
var interval = setInterval(function() {
|
|
57
|
+
const setUserData = useCallback(async (dataInput)=>{
|
|
58
|
+
userData.current = await convertUserData(dataInput);
|
|
59
|
+
localStorage.setItem('ud', Buffer.from(JSON.stringify(userData.current), 'utf8').toString('base64'));
|
|
60
|
+
}, []);
|
|
61
|
+
useEffect(()=>{
|
|
62
|
+
const interval = setInterval(()=>{
|
|
285
63
|
if (window.fluxDataLayer) {
|
|
286
64
|
drainEvents();
|
|
287
65
|
clearInterval(interval);
|
|
288
66
|
}
|
|
289
67
|
}, TIMEOUT_TO_CLEAR_EVENTS);
|
|
290
|
-
return
|
|
291
|
-
return clearInterval(interval);
|
|
292
|
-
};
|
|
68
|
+
return ()=>clearInterval(interval);
|
|
293
69
|
}, []);
|
|
294
|
-
useEffect(
|
|
295
|
-
|
|
70
|
+
useEffect(()=>{
|
|
71
|
+
const ud = localStorage.getItem('ud');
|
|
296
72
|
if (!ud) {
|
|
297
73
|
return;
|
|
298
74
|
}
|
|
299
75
|
try {
|
|
300
|
-
|
|
76
|
+
const json = Buffer.from(ud, 'base64').toString('utf8');
|
|
301
77
|
userData.current = JSON.parse(json);
|
|
302
78
|
} catch (e) {}
|
|
303
79
|
}, []);
|
|
304
80
|
return {
|
|
305
|
-
track
|
|
306
|
-
setUserData
|
|
81
|
+
track,
|
|
82
|
+
setUserData
|
|
307
83
|
};
|
|
308
84
|
};
|
|
309
|
-
export
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
useEffect(
|
|
313
|
-
|
|
85
|
+
export const useAutoTrackEvent = (eventName, eventData)=>{
|
|
86
|
+
const previousEventData = useRef();
|
|
87
|
+
const firedFirstEvent = useRef(false);
|
|
88
|
+
useEffect(()=>{
|
|
89
|
+
const interval = setInterval(()=>{
|
|
314
90
|
if (window.fluxDataLayer) {
|
|
315
91
|
drainEvents();
|
|
316
92
|
clearInterval(interval);
|
|
317
93
|
}
|
|
318
94
|
}, TIMEOUT_TO_CLEAR_EVENTS);
|
|
319
|
-
return
|
|
320
|
-
return clearInterval(interval);
|
|
321
|
-
};
|
|
95
|
+
return ()=>clearInterval(interval);
|
|
322
96
|
}, []);
|
|
323
|
-
useEffect(
|
|
97
|
+
useEffect(()=>{
|
|
324
98
|
if (isEqual(previousEventData.current, eventData) && firedFirstEvent.current) {
|
|
325
99
|
return;
|
|
326
100
|
}
|
|
327
101
|
firedFirstEvent.current = true;
|
|
328
102
|
console.log('🚨🚨🚨 firing event', eventName, eventData);
|
|
329
|
-
|
|
330
|
-
event: eventName
|
|
331
|
-
|
|
103
|
+
const event = {
|
|
104
|
+
event: eventName,
|
|
105
|
+
...eventData
|
|
106
|
+
};
|
|
332
107
|
safeSendGTMEvent(event);
|
|
333
108
|
previousEventData.current = eventData;
|
|
334
109
|
}, [
|
package/dist/utils.js
CHANGED
|
@@ -1,276 +1,50 @@
|
|
|
1
|
-
function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
};
|
|
1
|
+
export async function hashData(input) {
|
|
2
|
+
const encoder = new TextEncoder();
|
|
3
|
+
const data = encoder.encode(input);
|
|
4
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
5
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer)) // Convert buffer to byte array
|
|
6
|
+
;
|
|
7
|
+
const hashHex = hashArray.map((b)=>b.toString(16).padStart(2, '0')).join('') // Convert bytes to hex string
|
|
8
|
+
;
|
|
9
|
+
return hashHex;
|
|
29
10
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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;
|
|
11
|
+
export const getCurrentTimestampMicros = ()=>{
|
|
12
|
+
const now = new Date();
|
|
13
|
+
const epochMillis = now.getTime();
|
|
14
|
+
const epochMicros = epochMillis * 1000;
|
|
161
15
|
return epochMicros.toString();
|
|
162
16
|
};
|
|
163
|
-
export
|
|
164
|
-
|
|
17
|
+
export const extractGA4ClientId = (gaCookie)=>{
|
|
18
|
+
const matches = gaCookie.split('.');
|
|
165
19
|
if (matches.length > 2) {
|
|
166
|
-
return
|
|
20
|
+
return `${matches[2]}.${matches[3]}`;
|
|
167
21
|
}
|
|
168
22
|
return null;
|
|
169
23
|
};
|
|
170
|
-
export
|
|
171
|
-
|
|
24
|
+
export const extractGA4SessionId = (gaCookie)=>{
|
|
25
|
+
const matches = gaCookie.split('.');
|
|
172
26
|
if (matches.length > 2) {
|
|
173
|
-
return Number.parseInt(
|
|
27
|
+
return Number.parseInt(`${matches[2]}`);
|
|
174
28
|
}
|
|
175
29
|
return null;
|
|
176
30
|
};
|
|
177
|
-
export
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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);
|
|
31
|
+
export const convertUserData = async (dataInput)=>{
|
|
32
|
+
const userAddress = dataInput.addresses?.home || dataInput.addresses?.billing;
|
|
33
|
+
return {
|
|
34
|
+
user_id: dataInput.id,
|
|
35
|
+
email: await hashData(dataInput.email),
|
|
36
|
+
phone_number: dataInput.phoneNumber ? await hashData(dataInput.phoneNumber) : undefined,
|
|
37
|
+
address: userAddress ? {
|
|
38
|
+
first_name: dataInput.firstName ? await hashData(dataInput.firstName) : undefined,
|
|
39
|
+
last_name: dataInput.lastName ? await hashData(dataInput.lastName) : undefined,
|
|
40
|
+
street: [
|
|
41
|
+
userAddress.street1,
|
|
42
|
+
userAddress.street2
|
|
43
|
+
].join(', '),
|
|
44
|
+
city: userAddress.city,
|
|
45
|
+
region: userAddress.state,
|
|
46
|
+
postal_code: userAddress.postalCode,
|
|
47
|
+
country: userAddress.country
|
|
48
|
+
} : undefined
|
|
275
49
|
};
|
|
276
|
-
}
|
|
50
|
+
};
|
package/package.json
CHANGED
package/dist/cjs/package.json
DELETED