@xylabs/pixel 2.0.5 → 4.6.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/.eslintcache +1 -0
- package/dist/browser/index.mjs +17 -44
- package/dist/browser/index.mjs.map +1 -1
- package/dist/{browser → types}/Api/Api.d.ts +1 -1
- package/dist/{browser → types}/Api/UserEvent.d.ts +2 -2
- package/dist/types/Api/index.d.ts +4 -0
- package/dist/types/FunnelStartedFields.d.ts +5 -0
- package/dist/{browser → types}/Pixel.d.ts +3 -3
- package/dist/{browser → types}/PurchaseFields.d.ts +1 -1
- package/dist/types/TestStartedFields.d.ts +5 -0
- package/dist/types/UserClickFields.d.ts +8 -0
- package/dist/{browser → types}/UserClickFields.d.ts.map +1 -1
- package/dist/{browser → types}/UserEventHandler.d.ts +9 -8
- package/dist/types/UserEventHandler.d.ts.map +1 -0
- package/dist/types/ViewContentFields.d.ts +6 -0
- package/dist/{browser → types}/XyUserEventHandler.d.ts +5 -5
- package/dist/types/index.d.ts +15 -0
- package/package.json +12 -30
- package/src/Api/Api.ts +1 -1
- package/src/Api/UserEvent.ts +2 -2
- package/src/Api/index.ts +3 -3
- package/src/FunnelStartedFields.ts +1 -1
- package/src/Pixel.ts +8 -8
- package/src/PurchaseFields.ts +1 -1
- package/src/Referrer.ts +2 -2
- package/src/TestStartedFields.ts +1 -1
- package/src/UniqueUserId.ts +2 -2
- package/src/UserClickFields.ts +3 -1
- package/src/UserEventHandler.ts +9 -8
- package/src/UtmFields.ts +4 -4
- package/src/ViewContentFields.ts +1 -1
- package/src/XyUserEventHandler.ts +6 -6
- package/src/getSystemInfo.ts +2 -2
- package/src/index.ts +14 -14
- package/src/spec/Pixel.spec.ts +3 -1
- package/tsconfig.json +4 -0
- package/dist/browser/Api/index.d.ts +0 -4
- package/dist/browser/FunnelStartedFields.d.ts +0 -5
- package/dist/browser/TestStartedFields.d.ts +0 -5
- package/dist/browser/UserClickFields.d.ts +0 -6
- package/dist/browser/UserEventHandler.d.ts.map +0 -1
- package/dist/browser/ViewContentFields.d.ts +0 -6
- package/dist/browser/index.d.ts +0 -15
- package/eslint.config.mjs +0 -43
- package/jest.config.cjs +0 -25
- package/vitest.config.ts +0 -12
- package/vitest.startup.ts +0 -8
- /package/dist/{browser → types}/Api/Api.d.ts.map +0 -0
- /package/dist/{browser → types}/Api/UserEvent.d.ts.map +0 -0
- /package/dist/{browser → types}/Api/UserEventSystem.d.ts +0 -0
- /package/dist/{browser → types}/Api/UserEventSystem.d.ts.map +0 -0
- /package/dist/{browser → types}/Api/index.d.ts.map +0 -0
- /package/dist/{browser → types}/CommonFields.d.ts +0 -0
- /package/dist/{browser → types}/CommonFields.d.ts.map +0 -0
- /package/dist/{browser → types}/ExIds.d.ts +0 -0
- /package/dist/{browser → types}/ExIds.d.ts.map +0 -0
- /package/dist/{browser → types}/FunnelStartedFields.d.ts.map +0 -0
- /package/dist/{browser → types}/Pixel.d.ts.map +0 -0
- /package/dist/{browser → types}/PurchaseFields.d.ts.map +0 -0
- /package/dist/{browser → types}/Referrer.d.ts +0 -0
- /package/dist/{browser → types}/Referrer.d.ts.map +0 -0
- /package/dist/{browser → types}/TestStartedFields.d.ts.map +0 -0
- /package/dist/{browser → types}/UniqueUserId.d.ts +0 -0
- /package/dist/{browser → types}/UniqueUserId.d.ts.map +0 -0
- /package/dist/{browser → types}/UtmFields.d.ts +0 -0
- /package/dist/{browser → types}/UtmFields.d.ts.map +0 -0
- /package/dist/{browser → types}/ViewContentFields.d.ts.map +0 -0
- /package/dist/{browser → types}/XyLabsTrackingEventJson.d.ts +0 -0
- /package/dist/{browser → types}/XyLabsTrackingEventJson.d.ts.map +0 -0
- /package/dist/{browser → types}/XyUserEventHandler.d.ts.map +0 -0
- /package/dist/{browser → types}/getSystemInfo.d.ts +0 -0
- /package/dist/{browser → types}/getSystemInfo.d.ts.map +0 -0
- /package/dist/{browser → types}/index.d.ts.map +0 -0
package/.eslintcache
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/Api.ts":"1","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/UserEvent.ts":"2","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/UserEventSystem.ts":"3","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/index.ts":"4","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/CommonFields.ts":"5","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/ExIds.ts":"6","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/FunnelStartedFields.ts":"7","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Pixel.ts":"8","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/PurchaseFields.ts":"9","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Referrer.ts":"10","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/TestStartedFields.ts":"11","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UniqueUserId.ts":"12","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UserClickFields.ts":"13","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UserEventHandler.ts":"14","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UtmFields.ts":"15","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/ViewContentFields.ts":"16","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/XyLabsTrackingEventJson.ts":"17","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/XyUserEventHandler.ts":"18","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/getSystemInfo.ts":"19","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/index.ts":"20","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/spec/Pixel.spec.ts":"21","/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/xy.config.ts":"22"},{"size":597,"mtime":1742231940381,"results":"23","hashOfConfig":"24"},{"size":539,"mtime":1742231940309,"results":"25","hashOfConfig":"24"},{"size":91,"mtime":1742231576636,"results":"26","hashOfConfig":"24"},{"size":93,"mtime":1742231940435,"results":"27","hashOfConfig":"24"},{"size":72,"mtime":1742231576636,"results":"28","hashOfConfig":"24"},{"size":147,"mtime":1742231576636,"results":"29","hashOfConfig":"24"},{"size":132,"mtime":1742231940245,"results":"30","hashOfConfig":"24"},{"size":3118,"mtime":1742232082186,"results":"31","hashOfConfig":"24"},{"size":175,"mtime":1742231940691,"results":"32","hashOfConfig":"24"},{"size":897,"mtime":1742232095988,"results":"33","hashOfConfig":"24"},{"size":130,"mtime":1742231940756,"results":"34","hashOfConfig":"24"},{"size":382,"mtime":1742232105045,"results":"35","hashOfConfig":"24"},{"size":196,"mtime":1742231940804,"results":"36","hashOfConfig":"24"},{"size":784,"mtime":1742232150116,"results":"37","hashOfConfig":"24"},{"size":1379,"mtime":1742232116074,"results":"38","hashOfConfig":"24"},{"size":145,"mtime":1742231940859,"results":"39","hashOfConfig":"24"},{"size":440,"mtime":1742231576637,"results":"40","hashOfConfig":"24"},{"size":1309,"mtime":1742231940978,"results":"41","hashOfConfig":"24"},{"size":355,"mtime":1742231940519,"results":"42","hashOfConfig":"24"},{"size":502,"mtime":1742231941029,"results":"43","hashOfConfig":"24"},{"size":360,"mtime":1742232643436,"results":"44","hashOfConfig":"24"},{"size":194,"mtime":1742231576638,"results":"45","hashOfConfig":"24"},{"filePath":"46","messages":"47","suppressedMessages":"48","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"sm8jh6",{"filePath":"49","messages":"50","suppressedMessages":"51","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"52","messages":"53","suppressedMessages":"54","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"55","messages":"56","suppressedMessages":"57","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"58","messages":"59","suppressedMessages":"60","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"61","messages":"62","suppressedMessages":"63","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"64","messages":"65","suppressedMessages":"66","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"67","messages":"68","suppressedMessages":"69","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"70","messages":"71","suppressedMessages":"72","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"73","messages":"74","suppressedMessages":"75","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"76","messages":"77","suppressedMessages":"78","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"79","messages":"80","suppressedMessages":"81","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"82","messages":"83","suppressedMessages":"84","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"85","messages":"86","suppressedMessages":"87","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"88","messages":"89","suppressedMessages":"90","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"91","messages":"92","suppressedMessages":"93","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"94","messages":"95","suppressedMessages":"96","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"97","messages":"98","suppressedMessages":"99","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"100","messages":"101","suppressedMessages":"102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"103","messages":"104","suppressedMessages":"105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"106","messages":"107","suppressedMessages":"108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"109","messages":"110","suppressedMessages":"111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/Api.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/UserEvent.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/UserEventSystem.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Api/index.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/CommonFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/ExIds.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/FunnelStartedFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Pixel.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/PurchaseFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/Referrer.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/TestStartedFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UniqueUserId.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UserClickFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UserEventHandler.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/UtmFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/ViewContentFields.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/XyLabsTrackingEventJson.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/XyUserEventHandler.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/getSystemInfo.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/index.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/src/spec/Pixel.spec.ts",[],[],"/Users/arietrouw/Github/xylabs/sdk-js/packages/pixel/xy.config.ts",[],[]]
|
package/dist/browser/index.mjs
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
|
|
4
1
|
// src/Api/Api.ts
|
|
5
2
|
import axios from "axios";
|
|
6
3
|
var apiBaseUri = {
|
|
@@ -9,9 +6,6 @@ var apiBaseUri = {
|
|
|
9
6
|
prod: "https://pixel.xylabs.com"
|
|
10
7
|
};
|
|
11
8
|
var PixelApi = class {
|
|
12
|
-
static {
|
|
13
|
-
__name(this, "PixelApi");
|
|
14
|
-
}
|
|
15
9
|
endPoint;
|
|
16
10
|
/* baseUri can either be a preset (prod, beta, local), or a specific uri */
|
|
17
11
|
constructor(baseUri = "prod") {
|
|
@@ -31,20 +25,17 @@ import md5 from "spark-md5";
|
|
|
31
25
|
// src/getSystemInfo.ts
|
|
32
26
|
import Bowser from "bowser";
|
|
33
27
|
var systemInfo;
|
|
34
|
-
var getSystemInfo =
|
|
28
|
+
var getSystemInfo = () => {
|
|
35
29
|
try {
|
|
36
|
-
systemInfo = systemInfo || Bowser.getParser(
|
|
30
|
+
systemInfo = systemInfo || Bowser.getParser(globalThis.navigator.userAgent).getResult();
|
|
37
31
|
} catch (ex) {
|
|
38
32
|
console.log(`getSystemInfo Error: ${ex}`);
|
|
39
33
|
}
|
|
40
34
|
return systemInfo;
|
|
41
|
-
}
|
|
35
|
+
};
|
|
42
36
|
|
|
43
37
|
// src/Referrer.ts
|
|
44
38
|
var Referrer = class _Referrer {
|
|
45
|
-
static {
|
|
46
|
-
__name(this, "Referrer");
|
|
47
|
-
}
|
|
48
39
|
static storageId = "_coin_referrer";
|
|
49
40
|
local;
|
|
50
41
|
session;
|
|
@@ -52,7 +43,7 @@ var Referrer = class _Referrer {
|
|
|
52
43
|
this.session = this.getFromSession() ?? document.referrer;
|
|
53
44
|
sessionStorage.setItem(_Referrer.storageId, this.session);
|
|
54
45
|
this.local = this.getFromLocal() ?? document.referrer;
|
|
55
|
-
|
|
46
|
+
globalThis.localStorage.setItem(_Referrer.storageId, this.local);
|
|
56
47
|
}
|
|
57
48
|
toJson() {
|
|
58
49
|
if (this.local && this.local.length > 0 || this.session && this.session.length > 0) {
|
|
@@ -63,7 +54,7 @@ var Referrer = class _Referrer {
|
|
|
63
54
|
}
|
|
64
55
|
}
|
|
65
56
|
getFromLocal() {
|
|
66
|
-
const value =
|
|
57
|
+
const value = globalThis.localStorage.getItem(_Referrer.storageId);
|
|
67
58
|
if (value && value.length > 0) {
|
|
68
59
|
return value;
|
|
69
60
|
}
|
|
@@ -78,14 +69,11 @@ var Referrer = class _Referrer {
|
|
|
78
69
|
|
|
79
70
|
// src/UniqueUserId.ts
|
|
80
71
|
var UniqueUserId = class _UniqueUserId {
|
|
81
|
-
static {
|
|
82
|
-
__name(this, "UniqueUserId");
|
|
83
|
-
}
|
|
84
72
|
static localStorageId = "_coin_cid";
|
|
85
73
|
id;
|
|
86
74
|
constructor() {
|
|
87
|
-
this.id =
|
|
88
|
-
|
|
75
|
+
this.id = globalThis.localStorage.getItem(_UniqueUserId.localStorageId) ?? this.generateId();
|
|
76
|
+
globalThis.localStorage.setItem(_UniqueUserId.localStorageId, this.id);
|
|
89
77
|
}
|
|
90
78
|
toString() {
|
|
91
79
|
return this.id;
|
|
@@ -98,13 +86,10 @@ var UniqueUserId = class _UniqueUserId {
|
|
|
98
86
|
// src/UtmFields.ts
|
|
99
87
|
import isEqual from "fast-deep-equal";
|
|
100
88
|
var UtmFields = class _UtmFields {
|
|
101
|
-
static {
|
|
102
|
-
__name(this, "UtmFields");
|
|
103
|
-
}
|
|
104
89
|
static localStorageId = "_coin_utm";
|
|
105
90
|
fields = [];
|
|
106
91
|
constructor() {
|
|
107
|
-
const storedString =
|
|
92
|
+
const storedString = globalThis.localStorage.getItem(_UtmFields.localStorageId) ?? "[]";
|
|
108
93
|
try {
|
|
109
94
|
this.fields = JSON.parse(storedString);
|
|
110
95
|
} catch {
|
|
@@ -114,20 +99,20 @@ var UtmFields = class _UtmFields {
|
|
|
114
99
|
this.fields = [];
|
|
115
100
|
}
|
|
116
101
|
this.update();
|
|
117
|
-
|
|
102
|
+
globalThis.localStorage.setItem(_UtmFields.localStorageId, JSON.stringify(this.fields));
|
|
118
103
|
}
|
|
119
|
-
getUtmRecord =
|
|
104
|
+
getUtmRecord = () => {
|
|
120
105
|
const record = {};
|
|
121
106
|
const parsedQueryString = document.location.search.split("?")[1]?.split("&") ?? [];
|
|
122
|
-
|
|
107
|
+
for (const item of parsedQueryString) {
|
|
123
108
|
const [fullKey, value] = item.split("=");
|
|
124
109
|
const [keyCategory, keyName] = fullKey.split("_");
|
|
125
110
|
if (keyCategory === "utm") {
|
|
126
111
|
record[keyName] = value;
|
|
127
112
|
}
|
|
128
|
-
}
|
|
113
|
+
}
|
|
129
114
|
return Object.keys(record).length > 0 ? record : null;
|
|
130
|
-
}
|
|
115
|
+
};
|
|
131
116
|
toString() {
|
|
132
117
|
return JSON.stringify(this.fields);
|
|
133
118
|
}
|
|
@@ -144,9 +129,6 @@ var UtmFields = class _UtmFields {
|
|
|
144
129
|
// src/Pixel.ts
|
|
145
130
|
var emailHashLocalStorageName = "xy_email_hash";
|
|
146
131
|
var XyPixel = class _XyPixel {
|
|
147
|
-
static {
|
|
148
|
-
__name(this, "XyPixel");
|
|
149
|
-
}
|
|
150
132
|
static api = new PixelApi();
|
|
151
133
|
static _instance;
|
|
152
134
|
static utmFieldsObj;
|
|
@@ -162,7 +144,7 @@ var XyPixel = class _XyPixel {
|
|
|
162
144
|
this.email_hash = localStorage.getItem(emailHashLocalStorageName);
|
|
163
145
|
}
|
|
164
146
|
static get instance() {
|
|
165
|
-
return assertEx(this._instance, "XyPixel uninitialized");
|
|
147
|
+
return assertEx(this._instance, () => "XyPixel uninitialized");
|
|
166
148
|
}
|
|
167
149
|
static init(pixelId) {
|
|
168
150
|
this._instance = new _XyPixel(pixelId);
|
|
@@ -171,12 +153,12 @@ var XyPixel = class _XyPixel {
|
|
|
171
153
|
static selectApi(api) {
|
|
172
154
|
this.api = api;
|
|
173
155
|
}
|
|
174
|
-
static utmFields =
|
|
156
|
+
static utmFields = () => {
|
|
175
157
|
if (_XyPixel.utmFieldsObj === void 0) {
|
|
176
158
|
_XyPixel.utmFieldsObj = new UtmFields();
|
|
177
159
|
}
|
|
178
160
|
return _XyPixel.utmFieldsObj;
|
|
179
|
-
}
|
|
161
|
+
};
|
|
180
162
|
identify(email) {
|
|
181
163
|
this.email = email;
|
|
182
164
|
this.email_hash = email ? md5.hash(email, true) : void 0;
|
|
@@ -216,10 +198,7 @@ var XyPixel = class _XyPixel {
|
|
|
216
198
|
await api.trackEvents(events);
|
|
217
199
|
} catch (ex) {
|
|
218
200
|
if (events) {
|
|
219
|
-
this.queue = [
|
|
220
|
-
...this.queue,
|
|
221
|
-
...events
|
|
222
|
-
];
|
|
201
|
+
this.queue = [...this.queue, ...events];
|
|
223
202
|
}
|
|
224
203
|
console.error(ex);
|
|
225
204
|
}
|
|
@@ -241,17 +220,11 @@ var XyPixel = class _XyPixel {
|
|
|
241
220
|
|
|
242
221
|
// src/UserEventHandler.ts
|
|
243
222
|
var UserEventHandler = class {
|
|
244
|
-
static {
|
|
245
|
-
__name(this, "UserEventHandler");
|
|
246
|
-
}
|
|
247
223
|
};
|
|
248
224
|
|
|
249
225
|
// src/XyUserEventHandler.ts
|
|
250
226
|
import { toJsonObject } from "@xylabs/object";
|
|
251
227
|
var XyUserEventHandler = class extends UserEventHandler {
|
|
252
|
-
static {
|
|
253
|
-
__name(this, "XyUserEventHandler");
|
|
254
|
-
}
|
|
255
228
|
constructor() {
|
|
256
229
|
super();
|
|
257
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Api/Api.ts","../../src/Pixel.ts","../../src/getSystemInfo.ts","../../src/Referrer.ts","../../src/UniqueUserId.ts","../../src/UtmFields.ts","../../src/UserEventHandler.ts","../../src/XyUserEventHandler.ts"],"sourcesContent":["import axios from 'axios'\n\nimport type { UserEvent } from './UserEvent.js'\n\nconst apiBaseUri: Record<string, string> = {\n beta: 'https://pixel.xylabs.com',\n local: 'http://localhost:3030',\n prod: 'https://pixel.xylabs.com',\n}\n\nexport class PixelApi {\n private endPoint: string\n\n /* baseUri can either be a preset (prod, beta, local), or a specific uri */\n constructor(baseUri = 'prod') {\n this.endPoint = apiBaseUri[baseUri] ? `${apiBaseUri[baseUri]}/t/event/queue` : baseUri\n }\n\n async trackEvents(events: UserEvent[]) {\n return (await axios.post(this.endPoint, events)).data\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { JsonObject } from '@xylabs/object'\nimport { Mutex } from 'async-mutex'\nimport Cookies from 'js-cookie'\nimport md5 from 'spark-md5'\n\nimport type { UserEvent } from './Api/index.js'\nimport { PixelApi } from './Api/index.js'\nimport type { ExIds } from './ExIds.js'\nimport { getSystemInfo } from './getSystemInfo.js'\nimport { Referrer } from './Referrer.js'\nimport { UniqueUserId } from './UniqueUserId.js'\nimport { UtmFields } from './UtmFields.js'\n\nconst emailHashLocalStorageName = 'xy_email_hash'\n\nexport class XyPixel {\n static api = new PixelApi()\n\n private static _instance?: XyPixel\n private static utmFieldsObj: UtmFields\n\n cid = new UniqueUserId().id\n email?: string\n email_hash?: string | null\n exids?: ExIds\n pixelId?: string\n\n queue: UserEvent[] = []\n\n private queueMutex = new Mutex()\n\n private constructor(pixelId: string) {\n this.pixelId = pixelId\n this.email_hash = localStorage.getItem(emailHashLocalStorageName)\n }\n\n static get instance(): XyPixel {\n return assertEx(this._instance, 'XyPixel uninitialized')\n }\n\n static init(pixelId: string) {\n this._instance = new XyPixel(pixelId)\n return this._instance\n }\n\n static selectApi(api: PixelApi) {\n this.api = api\n }\n\n private static utmFields = () => {\n if (XyPixel.utmFieldsObj === undefined) {\n XyPixel.utmFieldsObj = new UtmFields()\n }\n return XyPixel.utmFieldsObj\n }\n\n identify(email?: string) {\n this.email = email\n this.email_hash = email ? md5.hash(email, true) : undefined\n if (this.email_hash) {\n localStorage.setItem(emailHashLocalStorageName, this.email_hash)\n }\n }\n\n async send<T extends JsonObject>(event: string, fields?: T, eventId?: string) {\n this.updateFbId()\n const utm = XyPixel.utmFields().update()\n const referrer = new Referrer()\n this.queue.push({\n cid: this.cid,\n create_time: Date.now(),\n email_hash: this.email_hash ?? undefined,\n event,\n event_id: eventId,\n exids: this.exids,\n fields,\n host: document.location.host,\n pathname: document.location.pathname,\n pixel: this.pixelId,\n referrer: referrer.toJson(),\n system: getSystemInfo(),\n utm,\n })\n await this.tryFlushQueue()\n }\n\n private async tryFlushQueue() {\n await this.queueMutex.runExclusive(async () => {\n if (this.queue.length === 0) return\n const api = XyPixel.api\n if (api) {\n const events = this.queue\n this.queue = []\n try {\n await api.trackEvents(events)\n } catch (ex) {\n if (events) {\n // put it back since it failed\n this.queue = [...this.queue, ...events]\n }\n console.error(ex)\n }\n }\n })\n }\n\n private updateFbId() {\n this.exids = {\n fbc: Cookies.get('_fbc'),\n fbp: Cookies.get('_fbp'),\n ga: Cookies.get('_ga'),\n gclid: Cookies.get('_gcl_aw'),\n rdt_uid: Cookies.get('rdt_uid'),\n scid: Cookies.get('_scid'),\n tt_sessionId: sessionStorage.getItem('tt_sessionId') ?? undefined,\n }\n }\n}\n","import Bowser from 'bowser'\n\nimport type { UserEventSystem } from './Api/index.js'\n\nlet systemInfo: UserEventSystem | undefined\n\nexport const getSystemInfo = () => {\n try {\n systemInfo = systemInfo || Bowser.getParser(window.navigator.userAgent).getResult()\n } catch (ex) {\n console.log(`getSystemInfo Error: ${ex}`)\n }\n return systemInfo\n}\n","export class Referrer {\n private static storageId = '_coin_referrer'\n local: string\n session: string\n constructor() {\n this.session = this.getFromSession() ?? document.referrer\n sessionStorage.setItem(Referrer.storageId, this.session)\n this.local = this.getFromLocal() ?? document.referrer\n window.localStorage.setItem(Referrer.storageId, this.local)\n }\n\n toJson() {\n if ((this.local && this.local.length > 0) || (this.session && this.session.length > 0)) {\n return {\n local: this.local,\n session: this.session,\n }\n }\n }\n\n private getFromLocal() {\n const value = window.localStorage.getItem(Referrer.storageId)\n if (value && value.length > 0) {\n return value\n }\n }\n\n private getFromSession() {\n const value = sessionStorage.getItem(Referrer.storageId)\n if (value && value.length > 0) {\n return value\n }\n }\n}\n","export class UniqueUserId {\n private static localStorageId = '_coin_cid'\n id: string\n\n constructor() {\n this.id = window.localStorage.getItem(UniqueUserId.localStorageId) ?? this.generateId()\n window.localStorage.setItem(UniqueUserId.localStorageId, this.id)\n }\n\n toString() {\n return this.id\n }\n\n private generateId() {\n return crypto.randomUUID()\n }\n}\n","import isEqual from 'fast-deep-equal'\n\nexport class UtmFields {\n private static localStorageId = '_coin_utm'\n fields: Record<string, string>[] = []\n constructor() {\n const storedString = window.localStorage.getItem(UtmFields.localStorageId) ?? '[]'\n try {\n this.fields = JSON.parse(storedString)\n } catch {\n this.fields = []\n }\n // this clears the old object version if needed\n if (!Array.isArray(this.fields)) {\n this.fields = []\n }\n this.update()\n window.localStorage.setItem(UtmFields.localStorageId, JSON.stringify(this.fields))\n }\n\n getUtmRecord = () => {\n const record: Record<string, string> = {}\n const parsedQueryString = document.location.search.split('?')[1]?.split('&') ?? []\n parsedQueryString.map((item) => {\n const [fullKey, value] = item.split('=')\n const [keyCategory, keyName] = fullKey.split('_')\n if (keyCategory === 'utm') {\n record[keyName] = value\n }\n })\n return Object.keys(record).length > 0 ? record : null\n }\n\n toString() {\n return JSON.stringify(this.fields)\n }\n\n // check the query string and if there an new/updated utm values, add them to the fields\n update() {\n const record = this.getUtmRecord()\n if (record && !isEqual(this.fields.at(-1), record)) {\n this.fields.push(record)\n }\n return this.fields ?? undefined\n }\n}\n","import type { EmptyObject } from '@xylabs/object'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.js'\nimport type { TestStartedFields } from './TestStartedFields.js'\nimport type { UserClickFields } from './UserClickFields.js'\nimport type { ViewContentFields } from './ViewContentFields.js'\n\nexport abstract class UserEventHandler<TData extends EmptyObject> {\n abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promise<void>\n abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promise<void>\n abstract userClick<T extends TData>(fields: T | UserClickFields): Promise<void>\n abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promise<void>\n}\n","import { type EmptyObject, toJsonObject } from '@xylabs/object'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.js'\nimport { XyPixel } from './Pixel.js'\nimport type { PurchaseFields } from './PurchaseFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.js'\nimport type { UserClickFields } from './UserClickFields.js'\nimport { UserEventHandler } from './UserEventHandler.js'\nimport type { ViewContentFields } from './ViewContentFields.js'\n\nexport class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {\n constructor() {\n super()\n }\n\n async funnelStarted(fields: T | FunnelStartedFields) {\n return await XyPixel.instance.send('FunnelStarted', toJsonObject(fields, [], 10))\n }\n\n async purchase(fields: T | PurchaseFields) {\n return await XyPixel.instance.send('Purchase', toJsonObject(fields, [], 10))\n }\n\n async testStarted(fields: T | TestStartedFields) {\n return await XyPixel.instance.send('TestStarted', toJsonObject(fields, [], 10))\n }\n\n async userClick(fields: T | UserClickFields) {\n return await XyPixel.instance.send('ViewPage', toJsonObject(fields, [], 10))\n }\n\n async viewContent(fields: T | ViewContentFields) {\n return await XyPixel.instance.send('ViewContent', toJsonObject(fields, [], 10))\n }\n}\n"],"mappings":"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","names":["axios","apiBaseUri","beta","local","prod","PixelApi","endPoint","constructor","baseUri","trackEvents","events","axios","post","data","assertEx","Mutex","Cookies","md5","Bowser","systemInfo","getSystemInfo","Bowser","getParser","window","navigator","userAgent","getResult","ex","console","log","Referrer","storageId","local","session","constructor","getFromSession","document","referrer","sessionStorage","setItem","getFromLocal","window","localStorage","toJson","length","value","getItem","UniqueUserId","localStorageId","id","constructor","window","localStorage","getItem","generateId","setItem","toString","crypto","randomUUID","isEqual","UtmFields","localStorageId","fields","constructor","storedString","window","localStorage","getItem","JSON","parse","Array","isArray","update","setItem","stringify","getUtmRecord","record","parsedQueryString","document","location","search","split","map","item","fullKey","value","keyCategory","keyName","Object","keys","length","toString","isEqual","at","push","undefined","emailHashLocalStorageName","XyPixel","api","PixelApi","_instance","utmFieldsObj","cid","UniqueUserId","id","email","email_hash","exids","pixelId","queue","queueMutex","Mutex","localStorage","getItem","instance","assertEx","init","selectApi","utmFields","undefined","UtmFields","identify","md5","hash","setItem","send","event","fields","eventId","updateFbId","utm","update","referrer","Referrer","push","create_time","Date","now","event_id","host","document","location","pathname","pixel","toJson","system","getSystemInfo","tryFlushQueue","runExclusive","length","events","trackEvents","ex","console","error","fbc","Cookies","get","fbp","ga","gclid","rdt_uid","scid","tt_sessionId","sessionStorage","UserEventHandler","toJsonObject","XyUserEventHandler","UserEventHandler","constructor","funnelStarted","fields","XyPixel","instance","send","toJsonObject","purchase","testStarted","userClick","viewContent"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Api/Api.ts","../../src/Pixel.ts","../../src/getSystemInfo.ts","../../src/Referrer.ts","../../src/UniqueUserId.ts","../../src/UtmFields.ts","../../src/UserEventHandler.ts","../../src/XyUserEventHandler.ts"],"sourcesContent":["import axios from 'axios'\n\nimport type { UserEvent } from './UserEvent.ts'\n\nconst apiBaseUri: Record<string, string> = {\n beta: 'https://pixel.xylabs.com',\n local: 'http://localhost:3030',\n prod: 'https://pixel.xylabs.com',\n}\n\nexport class PixelApi {\n private endPoint: string\n\n /* baseUri can either be a preset (prod, beta, local), or a specific uri */\n constructor(baseUri = 'prod') {\n this.endPoint = apiBaseUri[baseUri] ? `${apiBaseUri[baseUri]}/t/event/queue` : baseUri\n }\n\n async trackEvents(events: UserEvent[]) {\n return (await axios.post(this.endPoint, events)).data\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { JsonObject } from '@xylabs/object'\nimport { Mutex } from 'async-mutex'\nimport Cookies from 'js-cookie'\nimport md5 from 'spark-md5'\n\nimport type { UserEvent } from './Api/index.ts'\nimport { PixelApi } from './Api/index.ts'\nimport type { ExIds } from './ExIds.ts'\nimport { getSystemInfo } from './getSystemInfo.ts'\nimport { Referrer } from './Referrer.ts'\nimport { UniqueUserId } from './UniqueUserId.ts'\nimport { UtmFields } from './UtmFields.ts'\n\nconst emailHashLocalStorageName = 'xy_email_hash'\n\nexport class XyPixel {\n static api = new PixelApi()\n\n private static _instance?: XyPixel\n private static utmFieldsObj: UtmFields\n\n cid = new UniqueUserId().id\n email?: string\n email_hash?: string | null\n exids?: ExIds\n pixelId?: string\n\n queue: UserEvent[] = []\n\n private queueMutex = new Mutex()\n\n private constructor(pixelId: string) {\n this.pixelId = pixelId\n this.email_hash = localStorage.getItem(emailHashLocalStorageName)\n }\n\n static get instance(): XyPixel {\n return assertEx(this._instance, () => 'XyPixel uninitialized')\n }\n\n static init(pixelId: string) {\n this._instance = new XyPixel(pixelId)\n return this._instance\n }\n\n static selectApi(api: PixelApi) {\n this.api = api\n }\n\n private static utmFields = () => {\n if (XyPixel.utmFieldsObj === undefined) {\n XyPixel.utmFieldsObj = new UtmFields()\n }\n return XyPixel.utmFieldsObj\n }\n\n identify(email?: string) {\n this.email = email\n this.email_hash = email ? md5.hash(email, true) : undefined\n if (this.email_hash) {\n localStorage.setItem(emailHashLocalStorageName, this.email_hash)\n }\n }\n\n async send<T extends JsonObject>(event: string, fields?: T, eventId?: string) {\n this.updateFbId()\n const utm = XyPixel.utmFields().update()\n const referrer = new Referrer()\n this.queue.push({\n cid: this.cid,\n create_time: Date.now(),\n email_hash: this.email_hash ?? undefined,\n event,\n event_id: eventId,\n exids: this.exids,\n fields,\n host: document.location.host,\n pathname: document.location.pathname,\n pixel: this.pixelId,\n referrer: referrer.toJson(),\n system: getSystemInfo(),\n utm,\n })\n await this.tryFlushQueue()\n }\n\n private async tryFlushQueue() {\n await this.queueMutex.runExclusive(async () => {\n if (this.queue.length === 0) return\n const api = XyPixel.api\n if (api) {\n const events = this.queue\n this.queue = []\n try {\n await api.trackEvents(events)\n } catch (ex) {\n if (events) {\n // put it back since it failed\n this.queue = [...this.queue, ...events]\n }\n console.error(ex)\n }\n }\n })\n }\n\n private updateFbId() {\n this.exids = {\n fbc: Cookies.get('_fbc'),\n fbp: Cookies.get('_fbp'),\n ga: Cookies.get('_ga'),\n gclid: Cookies.get('_gcl_aw'),\n rdt_uid: Cookies.get('rdt_uid'),\n scid: Cookies.get('_scid'),\n tt_sessionId: sessionStorage.getItem('tt_sessionId') ?? undefined,\n }\n }\n}\n","import Bowser from 'bowser'\n\nimport type { UserEventSystem } from './Api/index.ts'\n\nlet systemInfo: UserEventSystem | undefined\n\nexport const getSystemInfo = () => {\n try {\n systemInfo = systemInfo || Bowser.getParser(globalThis.navigator.userAgent).getResult()\n } catch (ex) {\n console.log(`getSystemInfo Error: ${ex}`)\n }\n return systemInfo\n}\n","export class Referrer {\n private static storageId = '_coin_referrer'\n local: string\n session: string\n constructor() {\n this.session = this.getFromSession() ?? document.referrer\n sessionStorage.setItem(Referrer.storageId, this.session)\n this.local = this.getFromLocal() ?? document.referrer\n globalThis.localStorage.setItem(Referrer.storageId, this.local)\n }\n\n toJson() {\n if ((this.local && this.local.length > 0) || (this.session && this.session.length > 0)) {\n return {\n local: this.local,\n session: this.session,\n }\n }\n }\n\n private getFromLocal() {\n const value = globalThis.localStorage.getItem(Referrer.storageId)\n if (value && value.length > 0) {\n return value\n }\n }\n\n private getFromSession() {\n const value = sessionStorage.getItem(Referrer.storageId)\n if (value && value.length > 0) {\n return value\n }\n }\n}\n","export class UniqueUserId {\n private static localStorageId = '_coin_cid'\n id: string\n\n constructor() {\n this.id = globalThis.localStorage.getItem(UniqueUserId.localStorageId) ?? this.generateId()\n globalThis.localStorage.setItem(UniqueUserId.localStorageId, this.id)\n }\n\n toString() {\n return this.id\n }\n\n private generateId() {\n return crypto.randomUUID()\n }\n}\n","import isEqual from 'fast-deep-equal'\n\nexport class UtmFields {\n private static localStorageId = '_coin_utm'\n fields: Record<string, string>[] = []\n constructor() {\n const storedString = globalThis.localStorage.getItem(UtmFields.localStorageId) ?? '[]'\n try {\n this.fields = JSON.parse(storedString)\n } catch {\n this.fields = []\n }\n // this clears the old object version if needed\n if (!Array.isArray(this.fields)) {\n this.fields = []\n }\n this.update()\n globalThis.localStorage.setItem(UtmFields.localStorageId, JSON.stringify(this.fields))\n }\n\n getUtmRecord = () => {\n const record: Record<string, string> = {}\n const parsedQueryString = document.location.search.split('?')[1]?.split('&') ?? []\n for (const item of parsedQueryString) {\n const [fullKey, value] = item.split('=')\n const [keyCategory, keyName] = fullKey.split('_')\n if (keyCategory === 'utm') {\n record[keyName] = value\n }\n }\n return Object.keys(record).length > 0 ? record : null\n }\n\n toString() {\n return JSON.stringify(this.fields)\n }\n\n // check the query string and if there an new/updated utm values, add them to the fields\n update() {\n const record = this.getUtmRecord()\n if (record && !isEqual(this.fields.at(-1), record)) {\n this.fields.push(record)\n }\n return this.fields ?? undefined\n }\n}\n","import type { EmptyObject } from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\nexport abstract class UserEventHandler<TData extends EmptyObject> {\n abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promisable<void>\n abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promisable<void>\n abstract userClick<T extends TData>(fields: T | UserClickFields): Promisable<void>\n abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promisable<void>\n}\n","import { type EmptyObject, toJsonObject } from '@xylabs/object'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport { XyPixel } from './Pixel.ts'\nimport type { PurchaseFields } from './PurchaseFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport { UserEventHandler } from './UserEventHandler.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\nexport class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {\n constructor() {\n super()\n }\n\n async funnelStarted(fields: T | FunnelStartedFields) {\n return await XyPixel.instance.send('FunnelStarted', toJsonObject(fields, [], 10))\n }\n\n async purchase(fields: T | PurchaseFields) {\n return await XyPixel.instance.send('Purchase', toJsonObject(fields, [], 10))\n }\n\n async testStarted(fields: T | TestStartedFields) {\n return await XyPixel.instance.send('TestStarted', toJsonObject(fields, [], 10))\n }\n\n async userClick(fields: T | UserClickFields) {\n return await XyPixel.instance.send('ViewPage', toJsonObject(fields, [], 10))\n }\n\n async viewContent(fields: T | ViewContentFields) {\n return await XyPixel.instance.send('ViewContent', toJsonObject(fields, [], 10))\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ExIds } from '../ExIds.
|
|
2
|
-
import type { UserEventSystem } from './UserEventSystem.
|
|
1
|
+
import type { ExIds } from '../ExIds.ts';
|
|
2
|
+
import type { UserEventSystem } from './UserEventSystem.ts';
|
|
3
3
|
export interface UserEvent {
|
|
4
4
|
cid: string;
|
|
5
5
|
create_time?: number;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { JsonObject } from '@xylabs/object';
|
|
2
|
-
import type { UserEvent } from './Api/index.
|
|
3
|
-
import { PixelApi } from './Api/index.
|
|
4
|
-
import type { ExIds } from './ExIds.
|
|
2
|
+
import type { UserEvent } from './Api/index.ts';
|
|
3
|
+
import { PixelApi } from './Api/index.ts';
|
|
4
|
+
import type { ExIds } from './ExIds.ts';
|
|
5
5
|
export declare class XyPixel {
|
|
6
6
|
static api: PixelApi;
|
|
7
7
|
private static _instance?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserClickFields.d.ts","sourceRoot":"","sources":["../../src/UserClickFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"UserClickFields.d.ts","sourceRoot":"","sources":["../../src/UserClickFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import type { EmptyObject } from '@xylabs/object';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
2
|
+
import type { Promisable } from '@xylabs/promise';
|
|
3
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.ts';
|
|
4
|
+
import type { TestStartedFields } from './TestStartedFields.ts';
|
|
5
|
+
import type { UserClickFields } from './UserClickFields.ts';
|
|
6
|
+
import type { ViewContentFields } from './ViewContentFields.ts';
|
|
6
7
|
export declare abstract class UserEventHandler<TData extends EmptyObject> {
|
|
7
|
-
abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields):
|
|
8
|
-
abstract testStarted<T extends TData>(fields: T | TestStartedFields):
|
|
9
|
-
abstract userClick<T extends TData>(fields: T | UserClickFields):
|
|
10
|
-
abstract viewContent<T extends TData>(fields: T | ViewContentFields):
|
|
8
|
+
abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promisable<void>;
|
|
9
|
+
abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promisable<void>;
|
|
10
|
+
abstract userClick<T extends TData>(fields: T | UserClickFields): Promisable<void>;
|
|
11
|
+
abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promisable<void>;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=UserEventHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserEventHandler.d.ts","sourceRoot":"","sources":["../../src/UserEventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,8BAAsB,gBAAgB,CAAC,KAAK,SAAS,WAAW;IAC9D,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,mBAAmB,GAAG,UAAU,CAAC,IAAI,CAAC;IAC1F,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC;IACtF,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,eAAe,GAAG,UAAU,CAAC,IAAI,CAAC;IAClF,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC;CACvF"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { type EmptyObject } from '@xylabs/object';
|
|
2
|
-
import type { FunnelStartedFields } from './FunnelStartedFields.
|
|
2
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.ts';
|
|
3
3
|
import type { PurchaseFields } from './PurchaseFields.ts';
|
|
4
|
-
import type { TestStartedFields } from './TestStartedFields.
|
|
5
|
-
import type { UserClickFields } from './UserClickFields.
|
|
6
|
-
import { UserEventHandler } from './UserEventHandler.
|
|
7
|
-
import type { ViewContentFields } from './ViewContentFields.
|
|
4
|
+
import type { TestStartedFields } from './TestStartedFields.ts';
|
|
5
|
+
import type { UserClickFields } from './UserClickFields.ts';
|
|
6
|
+
import { UserEventHandler } from './UserEventHandler.ts';
|
|
7
|
+
import type { ViewContentFields } from './ViewContentFields.ts';
|
|
8
8
|
export declare class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {
|
|
9
9
|
constructor();
|
|
10
10
|
funnelStarted(fields: T | FunnelStartedFields): Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from './Api/index.ts';
|
|
2
|
+
export * from './CommonFields.ts';
|
|
3
|
+
export * from './FunnelStartedFields.ts';
|
|
4
|
+
export * from './Pixel.ts';
|
|
5
|
+
export * from './PurchaseFields.ts';
|
|
6
|
+
export * from './Referrer.ts';
|
|
7
|
+
export * from './TestStartedFields.ts';
|
|
8
|
+
export * from './UniqueUserId.ts';
|
|
9
|
+
export * from './UserClickFields.ts';
|
|
10
|
+
export * from './UserEventHandler.ts';
|
|
11
|
+
export * from './UtmFields.ts';
|
|
12
|
+
export * from './ViewContentFields.ts';
|
|
13
|
+
export * from './XyLabsTrackingEventJson.ts';
|
|
14
|
+
export * from './XyUserEventHandler.ts';
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/pixel",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.6.1",
|
|
4
4
|
"description": "Event Client for xylabs ESB",
|
|
5
5
|
"homepage": "https://xylabs.com",
|
|
6
6
|
"bugs": {
|
|
@@ -21,49 +21,31 @@
|
|
|
21
21
|
"type": "module",
|
|
22
22
|
"exports": {
|
|
23
23
|
".": {
|
|
24
|
-
"types": "./dist/
|
|
24
|
+
"types": "./dist/types/index.d.ts",
|
|
25
25
|
"default": "./dist/browser/index.mjs"
|
|
26
26
|
},
|
|
27
27
|
"./package.json": "./package.json"
|
|
28
28
|
},
|
|
29
29
|
"module": "dist/browser/index.mjs",
|
|
30
|
-
"types": "dist/
|
|
30
|
+
"types": "dist/types/index.d.ts",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@xylabs/assert": "^4.
|
|
33
|
-
"@xylabs/object": "^4.
|
|
32
|
+
"@xylabs/assert": "^4.6.1",
|
|
33
|
+
"@xylabs/object": "^4.6.1",
|
|
34
34
|
"async-mutex": "^0.5.0",
|
|
35
|
-
"axios": "^1.
|
|
35
|
+
"axios": "^1.8.3",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"fast-deep-equal": "^3.1.3",
|
|
38
38
|
"js-cookie": "^3.0.5",
|
|
39
39
|
"spark-md5": "^3.0.2"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@types/jest": "^29.5.12",
|
|
43
42
|
"@types/js-cookie": "^3.0.6",
|
|
44
|
-
"@types/
|
|
45
|
-
"@types/
|
|
46
|
-
"@
|
|
47
|
-
"@
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"@xylabs/ts-scripts-yarn3": "^4.0.7",
|
|
51
|
-
"@xylabs/tsconfig-dom": "^4.0.7",
|
|
52
|
-
"@xylabs/tsconfig-dom-jest": "^4.0.7",
|
|
53
|
-
"@xylabs/tsconfig-jest": "^4.0.7",
|
|
54
|
-
"axios": "^1.7.7",
|
|
55
|
-
"dotenv": "^16.4.5",
|
|
56
|
-
"eslint": "^9.9.1",
|
|
57
|
-
"eslint-import-resolver-typescript": "^3.6.3",
|
|
58
|
-
"jest": "^29.7.0",
|
|
59
|
-
"jest-environment-jsdom": "^29.7.0",
|
|
60
|
-
"jsdom": "^25.0.0",
|
|
61
|
-
"npm-package-json-lint": "^8.0.0",
|
|
62
|
-
"reflect-metadata": "^0.2.2",
|
|
63
|
-
"ts-jest": "^29.2.5",
|
|
64
|
-
"ts-node": "^10.9.2",
|
|
65
|
-
"typescript": "^5.5.4",
|
|
66
|
-
"vitest": "^2.0.5"
|
|
43
|
+
"@types/node": "^22.13.10",
|
|
44
|
+
"@types/spark-md5": "^3.0.5",
|
|
45
|
+
"@xylabs/ts-scripts-yarn3": "^6.1.4",
|
|
46
|
+
"@xylabs/tsconfig-dom": "^6.1.4",
|
|
47
|
+
"axios": "^1.8.3",
|
|
48
|
+
"typescript": "^5.8.2"
|
|
67
49
|
},
|
|
68
50
|
"packageManager": "yarn@4.4.0",
|
|
69
51
|
"publishConfig": {
|
package/src/Api/Api.ts
CHANGED
package/src/Api/UserEvent.ts
CHANGED
package/src/Api/index.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './Api.
|
|
2
|
-
export * from './UserEvent.
|
|
3
|
-
export * from './UserEventSystem.
|
|
1
|
+
export * from './Api.ts'
|
|
2
|
+
export * from './UserEvent.ts'
|
|
3
|
+
export * from './UserEventSystem.ts'
|
package/src/Pixel.ts
CHANGED
|
@@ -4,13 +4,13 @@ import { Mutex } from 'async-mutex'
|
|
|
4
4
|
import Cookies from 'js-cookie'
|
|
5
5
|
import md5 from 'spark-md5'
|
|
6
6
|
|
|
7
|
-
import type { UserEvent } from './Api/index.
|
|
8
|
-
import { PixelApi } from './Api/index.
|
|
9
|
-
import type { ExIds } from './ExIds.
|
|
10
|
-
import { getSystemInfo } from './getSystemInfo.
|
|
11
|
-
import { Referrer } from './Referrer.
|
|
12
|
-
import { UniqueUserId } from './UniqueUserId.
|
|
13
|
-
import { UtmFields } from './UtmFields.
|
|
7
|
+
import type { UserEvent } from './Api/index.ts'
|
|
8
|
+
import { PixelApi } from './Api/index.ts'
|
|
9
|
+
import type { ExIds } from './ExIds.ts'
|
|
10
|
+
import { getSystemInfo } from './getSystemInfo.ts'
|
|
11
|
+
import { Referrer } from './Referrer.ts'
|
|
12
|
+
import { UniqueUserId } from './UniqueUserId.ts'
|
|
13
|
+
import { UtmFields } from './UtmFields.ts'
|
|
14
14
|
|
|
15
15
|
const emailHashLocalStorageName = 'xy_email_hash'
|
|
16
16
|
|
|
@@ -36,7 +36,7 @@ export class XyPixel {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
static get instance(): XyPixel {
|
|
39
|
-
return assertEx(this._instance, 'XyPixel uninitialized')
|
|
39
|
+
return assertEx(this._instance, () => 'XyPixel uninitialized')
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
static init(pixelId: string) {
|
package/src/PurchaseFields.ts
CHANGED
package/src/Referrer.ts
CHANGED
|
@@ -6,7 +6,7 @@ export class Referrer {
|
|
|
6
6
|
this.session = this.getFromSession() ?? document.referrer
|
|
7
7
|
sessionStorage.setItem(Referrer.storageId, this.session)
|
|
8
8
|
this.local = this.getFromLocal() ?? document.referrer
|
|
9
|
-
|
|
9
|
+
globalThis.localStorage.setItem(Referrer.storageId, this.local)
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
toJson() {
|
|
@@ -19,7 +19,7 @@ export class Referrer {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
private getFromLocal() {
|
|
22
|
-
const value =
|
|
22
|
+
const value = globalThis.localStorage.getItem(Referrer.storageId)
|
|
23
23
|
if (value && value.length > 0) {
|
|
24
24
|
return value
|
|
25
25
|
}
|
package/src/TestStartedFields.ts
CHANGED
package/src/UniqueUserId.ts
CHANGED
|
@@ -3,8 +3,8 @@ export class UniqueUserId {
|
|
|
3
3
|
id: string
|
|
4
4
|
|
|
5
5
|
constructor() {
|
|
6
|
-
this.id =
|
|
7
|
-
|
|
6
|
+
this.id = globalThis.localStorage.getItem(UniqueUserId.localStorageId) ?? this.generateId()
|
|
7
|
+
globalThis.localStorage.setItem(UniqueUserId.localStorageId, this.id)
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
toString() {
|
package/src/UserClickFields.ts
CHANGED
package/src/UserEventHandler.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { EmptyObject } from '@xylabs/object'
|
|
2
|
+
import type { Promisable } from '@xylabs/promise'
|
|
2
3
|
|
|
3
|
-
import type { FunnelStartedFields } from './FunnelStartedFields.
|
|
4
|
-
import type { TestStartedFields } from './TestStartedFields.
|
|
5
|
-
import type { UserClickFields } from './UserClickFields.
|
|
6
|
-
import type { ViewContentFields } from './ViewContentFields.
|
|
4
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.ts'
|
|
5
|
+
import type { TestStartedFields } from './TestStartedFields.ts'
|
|
6
|
+
import type { UserClickFields } from './UserClickFields.ts'
|
|
7
|
+
import type { ViewContentFields } from './ViewContentFields.ts'
|
|
7
8
|
|
|
8
9
|
export abstract class UserEventHandler<TData extends EmptyObject> {
|
|
9
|
-
abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields):
|
|
10
|
-
abstract testStarted<T extends TData>(fields: T | TestStartedFields):
|
|
11
|
-
abstract userClick<T extends TData>(fields: T | UserClickFields):
|
|
12
|
-
abstract viewContent<T extends TData>(fields: T | ViewContentFields):
|
|
10
|
+
abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promisable<void>
|
|
11
|
+
abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promisable<void>
|
|
12
|
+
abstract userClick<T extends TData>(fields: T | UserClickFields): Promisable<void>
|
|
13
|
+
abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promisable<void>
|
|
13
14
|
}
|
package/src/UtmFields.ts
CHANGED
|
@@ -4,7 +4,7 @@ export class UtmFields {
|
|
|
4
4
|
private static localStorageId = '_coin_utm'
|
|
5
5
|
fields: Record<string, string>[] = []
|
|
6
6
|
constructor() {
|
|
7
|
-
const storedString =
|
|
7
|
+
const storedString = globalThis.localStorage.getItem(UtmFields.localStorageId) ?? '[]'
|
|
8
8
|
try {
|
|
9
9
|
this.fields = JSON.parse(storedString)
|
|
10
10
|
} catch {
|
|
@@ -15,19 +15,19 @@ export class UtmFields {
|
|
|
15
15
|
this.fields = []
|
|
16
16
|
}
|
|
17
17
|
this.update()
|
|
18
|
-
|
|
18
|
+
globalThis.localStorage.setItem(UtmFields.localStorageId, JSON.stringify(this.fields))
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
getUtmRecord = () => {
|
|
22
22
|
const record: Record<string, string> = {}
|
|
23
23
|
const parsedQueryString = document.location.search.split('?')[1]?.split('&') ?? []
|
|
24
|
-
|
|
24
|
+
for (const item of parsedQueryString) {
|
|
25
25
|
const [fullKey, value] = item.split('=')
|
|
26
26
|
const [keyCategory, keyName] = fullKey.split('_')
|
|
27
27
|
if (keyCategory === 'utm') {
|
|
28
28
|
record[keyName] = value
|
|
29
29
|
}
|
|
30
|
-
}
|
|
30
|
+
}
|
|
31
31
|
return Object.keys(record).length > 0 ? record : null
|
|
32
32
|
}
|
|
33
33
|
|
package/src/ViewContentFields.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type EmptyObject, toJsonObject } from '@xylabs/object'
|
|
2
2
|
|
|
3
|
-
import type { FunnelStartedFields } from './FunnelStartedFields.
|
|
4
|
-
import { XyPixel } from './Pixel.
|
|
3
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.ts'
|
|
4
|
+
import { XyPixel } from './Pixel.ts'
|
|
5
5
|
import type { PurchaseFields } from './PurchaseFields.ts'
|
|
6
|
-
import type { TestStartedFields } from './TestStartedFields.
|
|
7
|
-
import type { UserClickFields } from './UserClickFields.
|
|
8
|
-
import { UserEventHandler } from './UserEventHandler.
|
|
9
|
-
import type { ViewContentFields } from './ViewContentFields.
|
|
6
|
+
import type { TestStartedFields } from './TestStartedFields.ts'
|
|
7
|
+
import type { UserClickFields } from './UserClickFields.ts'
|
|
8
|
+
import { UserEventHandler } from './UserEventHandler.ts'
|
|
9
|
+
import type { ViewContentFields } from './ViewContentFields.ts'
|
|
10
10
|
|
|
11
11
|
export class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {
|
|
12
12
|
constructor() {
|
package/src/getSystemInfo.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import Bowser from 'bowser'
|
|
2
2
|
|
|
3
|
-
import type { UserEventSystem } from './Api/index.
|
|
3
|
+
import type { UserEventSystem } from './Api/index.ts'
|
|
4
4
|
|
|
5
5
|
let systemInfo: UserEventSystem | undefined
|
|
6
6
|
|
|
7
7
|
export const getSystemInfo = () => {
|
|
8
8
|
try {
|
|
9
|
-
systemInfo = systemInfo || Bowser.getParser(
|
|
9
|
+
systemInfo = systemInfo || Bowser.getParser(globalThis.navigator.userAgent).getResult()
|
|
10
10
|
} catch (ex) {
|
|
11
11
|
console.log(`getSystemInfo Error: ${ex}`)
|
|
12
12
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export * from './Api/index.
|
|
2
|
-
export * from './CommonFields.
|
|
3
|
-
export * from './FunnelStartedFields.
|
|
4
|
-
export * from './Pixel.
|
|
5
|
-
export * from './PurchaseFields.
|
|
6
|
-
export * from './Referrer.
|
|
7
|
-
export * from './TestStartedFields.
|
|
8
|
-
export * from './UniqueUserId.
|
|
9
|
-
export * from './UserClickFields.
|
|
10
|
-
export * from './UserEventHandler.
|
|
11
|
-
export * from './UtmFields.
|
|
12
|
-
export * from './ViewContentFields.
|
|
13
|
-
export * from './XyLabsTrackingEventJson.
|
|
14
|
-
export * from './XyUserEventHandler.
|
|
1
|
+
export * from './Api/index.ts'
|
|
2
|
+
export * from './CommonFields.ts'
|
|
3
|
+
export * from './FunnelStartedFields.ts'
|
|
4
|
+
export * from './Pixel.ts'
|
|
5
|
+
export * from './PurchaseFields.ts'
|
|
6
|
+
export * from './Referrer.ts'
|
|
7
|
+
export * from './TestStartedFields.ts'
|
|
8
|
+
export * from './UniqueUserId.ts'
|
|
9
|
+
export * from './UserClickFields.ts'
|
|
10
|
+
export * from './UserEventHandler.ts'
|
|
11
|
+
export * from './UtmFields.ts'
|
|
12
|
+
export * from './ViewContentFields.ts'
|
|
13
|
+
export * from './XyLabsTrackingEventJson.ts'
|
|
14
|
+
export * from './XyUserEventHandler.ts'
|
package/src/spec/Pixel.spec.ts
CHANGED
package/tsconfig.json
ADDED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UserEventHandler.d.ts","sourceRoot":"","sources":["../../src/UserEventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,8BAAsB,gBAAgB,CAAC,KAAK,SAAS,WAAW;IAC9D,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IACvF,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IACnF,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAC/E,QAAQ,CAAC,WAAW,CAAC,CAAC,SAAS,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CACpF"}
|
package/dist/browser/index.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export * from './Api/index.js';
|
|
2
|
-
export * from './CommonFields.js';
|
|
3
|
-
export * from './FunnelStartedFields.js';
|
|
4
|
-
export * from './Pixel.js';
|
|
5
|
-
export * from './PurchaseFields.js';
|
|
6
|
-
export * from './Referrer.js';
|
|
7
|
-
export * from './TestStartedFields.js';
|
|
8
|
-
export * from './UniqueUserId.js';
|
|
9
|
-
export * from './UserClickFields.js';
|
|
10
|
-
export * from './UserEventHandler.js';
|
|
11
|
-
export * from './UtmFields.js';
|
|
12
|
-
export * from './ViewContentFields.js';
|
|
13
|
-
export * from './XyLabsTrackingEventJson.js';
|
|
14
|
-
export * from './XyUserEventHandler.js';
|
|
15
|
-
//# sourceMappingURL=index.d.ts.map
|
package/eslint.config.mjs
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// eslint.config.mjs
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
config as xylabsConfig, rulesConfig, importConfig,
|
|
5
|
-
} from '@xylabs/eslint-config-flat'
|
|
6
|
-
|
|
7
|
-
export default [
|
|
8
|
-
{ ignores: ['.yarn/**', 'jest.config.cjs', '**/dist/**', 'dist', 'build/**', 'node_modules/**', 'eslint.config.mjs'] },
|
|
9
|
-
...xylabsConfig,
|
|
10
|
-
{
|
|
11
|
-
rules: {
|
|
12
|
-
'no-restricted-imports': [
|
|
13
|
-
'warn',
|
|
14
|
-
{
|
|
15
|
-
paths: [
|
|
16
|
-
...rulesConfig.rules['no-restricted-imports'][1].paths,
|
|
17
|
-
'@types/node',
|
|
18
|
-
'@xyo-network/archivist',
|
|
19
|
-
'@xyo-network/bridge',
|
|
20
|
-
'@xyo-network/core',
|
|
21
|
-
'@xyo-network/diviner',
|
|
22
|
-
'@xyo-network/module',
|
|
23
|
-
'@xyo-network/modules',
|
|
24
|
-
'@xyo-network/node',
|
|
25
|
-
'@xyo-network/sdk',
|
|
26
|
-
'@xyo-network/plugins',
|
|
27
|
-
'@xyo-network/protocol',
|
|
28
|
-
'@xyo-network/sentinel',
|
|
29
|
-
'@xyo-network/witness',
|
|
30
|
-
'@xyo-network/core-payload-plugins',
|
|
31
|
-
],
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
...importConfig,
|
|
38
|
-
rules: {
|
|
39
|
-
...importConfig.rules,
|
|
40
|
-
'import-x/no-cycle': ['warn', { maxDepth: 5 }],
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
]
|
package/jest.config.cjs
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const generateJestConfig = ({ esModules }) => {
|
|
2
|
-
const esModulesList = Array.isArray(esModules) ? esModules.join('|') : esModules
|
|
3
|
-
return {
|
|
4
|
-
moduleNameMapper: {
|
|
5
|
-
'^(\\.{1,2}/.*)\\.js$': '$1',
|
|
6
|
-
},
|
|
7
|
-
preset: 'ts-jest',
|
|
8
|
-
testEnvironment: 'jsdom',
|
|
9
|
-
testRegex: String.raw`(/__tests__/.*|(\.|/)(test|spec))\.tsx?$`,
|
|
10
|
-
transform: {
|
|
11
|
-
[`(${esModulesList}).+\\.js$`]: 'babel-jest',
|
|
12
|
-
'^.+\\.tsx?$': [
|
|
13
|
-
'ts-jest',
|
|
14
|
-
{
|
|
15
|
-
tsconfig: 'tsconfig.test.json',
|
|
16
|
-
useESM: true,
|
|
17
|
-
},
|
|
18
|
-
],
|
|
19
|
-
},
|
|
20
|
-
transformIgnorePatterns: [`./node_modules/(?!${esModulesList})`],
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// eslint-disable-next-line no-undef
|
|
25
|
-
module.exports = generateJestConfig({ esModules: ['is-ip', 'ip-regex'] })
|
package/vitest.config.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import dotenv from 'dotenv'
|
|
2
|
-
// eslint-disable-next-line import-x/no-internal-modules
|
|
3
|
-
import { defineConfig } from 'vitest/config'
|
|
4
|
-
|
|
5
|
-
dotenv.config()
|
|
6
|
-
|
|
7
|
-
export default defineConfig({
|
|
8
|
-
test: {
|
|
9
|
-
globals: true,
|
|
10
|
-
setupFiles: ['./vitest.startup.ts'],
|
|
11
|
-
},
|
|
12
|
-
})
|
package/vitest.startup.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as matchers from 'jest-extended'
|
|
2
|
-
import { expect, vi } from 'vitest'
|
|
3
|
-
|
|
4
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
-
(globalThis as any).jest = vi // replace jest with vi
|
|
6
|
-
|
|
7
|
-
// Extend Vitest's expect with jest-extended matchers
|
|
8
|
-
expect.extend(matchers)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|