@xylabs/pixel 2.0.1 → 2.0.2
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/browser/Api/Api.d.ts +7 -0
- package/dist/browser/Api/Api.d.ts.map +1 -0
- package/dist/browser/Api/UserEvent.d.ts +25 -0
- package/dist/browser/Api/UserEvent.d.ts.map +1 -0
- package/dist/browser/Api/UserEventSystem.d.ts +3 -0
- package/dist/browser/Api/UserEventSystem.d.ts.map +1 -0
- package/dist/browser/Api/index.d.ts +4 -0
- package/dist/browser/Api/index.d.ts.map +1 -0
- package/dist/browser/CommonFields.d.ts +5 -0
- package/dist/browser/CommonFields.d.ts.map +1 -0
- package/dist/browser/ExIds.d.ts +10 -0
- package/dist/browser/ExIds.d.ts.map +1 -0
- package/dist/browser/FunnelStartedFields.d.ts +5 -0
- package/dist/browser/FunnelStartedFields.d.ts.map +1 -0
- package/dist/browser/Pixel.d.ts +26 -0
- package/dist/browser/Pixel.d.ts.map +1 -0
- package/dist/browser/PurchaseFields.d.ts +8 -0
- package/dist/browser/PurchaseFields.d.ts.map +1 -0
- package/dist/browser/Referrer.d.ts +13 -0
- package/dist/browser/Referrer.d.ts.map +1 -0
- package/dist/browser/TestStartedFields.d.ts +5 -0
- package/dist/browser/TestStartedFields.d.ts.map +1 -0
- package/dist/browser/UniqueUserId.d.ts +8 -0
- package/dist/browser/UniqueUserId.d.ts.map +1 -0
- package/dist/browser/UserClickFields.d.ts +6 -0
- package/dist/browser/UserClickFields.d.ts.map +1 -0
- package/dist/browser/UserEventHandler.d.ts +11 -0
- package/dist/browser/UserEventHandler.d.ts.map +1 -0
- package/dist/browser/UtmFields.d.ts +9 -0
- package/dist/browser/UtmFields.d.ts.map +1 -0
- package/dist/browser/ViewContentFields.d.ts +6 -0
- package/dist/browser/ViewContentFields.d.ts.map +1 -0
- package/dist/browser/XyLabsTrackingEventJson.d.ts +21 -0
- package/dist/browser/XyLabsTrackingEventJson.d.ts.map +1 -0
- package/dist/browser/XyUserEventHandler.d.ts +16 -0
- package/dist/browser/XyUserEventHandler.d.ts.map +1 -0
- package/dist/browser/getSystemInfo.d.ts +3 -0
- package/dist/browser/getSystemInfo.d.ts.map +1 -0
- package/dist/browser/index.d.ts +13 -155
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.mjs +8 -4
- package/dist/browser/index.mjs.map +1 -1
- package/eslint.config.mjs +7 -7
- package/package.json +40 -39
- package/src/Api/Api.ts +1 -1
- package/src/Api/UserEvent.ts +2 -2
- package/src/Api/UserEventSystem.ts +1 -1
- package/src/CommonFields.ts +1 -1
- package/src/FunnelStartedFields.ts +1 -1
- package/src/Pixel.ts +5 -3
- package/src/PurchaseFields.ts +8 -0
- package/src/TestStartedFields.ts +1 -1
- package/src/UserClickFields.ts +1 -1
- package/src/UserEventHandler.ts +4 -4
- package/src/ViewContentFields.ts +1 -1
- package/src/XyUserEventHandler.ts +16 -9
- package/src/getSystemInfo.ts +1 -1
- package/xy.config.ts +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../../src/Api/Api.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAQ/C,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAQ;gBAGZ,OAAO,SAAS;IAItB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE;CAGtC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExIds } from '../ExIds.js';
|
|
2
|
+
import type { UserEventSystem } from './UserEventSystem.js';
|
|
3
|
+
export interface UserEvent {
|
|
4
|
+
cid: string;
|
|
5
|
+
create_time?: number;
|
|
6
|
+
email?: string;
|
|
7
|
+
email_hash?: string;
|
|
8
|
+
event?: string;
|
|
9
|
+
event_id?: string;
|
|
10
|
+
exids?: ExIds;
|
|
11
|
+
fields?: Record<string, unknown>;
|
|
12
|
+
host?: string;
|
|
13
|
+
pathname?: string;
|
|
14
|
+
pixel?: string;
|
|
15
|
+
receive_time?: number;
|
|
16
|
+
referrer?: {
|
|
17
|
+
local: string;
|
|
18
|
+
session: string;
|
|
19
|
+
};
|
|
20
|
+
rid?: string;
|
|
21
|
+
system?: UserEventSystem;
|
|
22
|
+
uid?: string;
|
|
23
|
+
utm?: Record<string, string>[] | Record<string, string[]>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=UserEvent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserEvent.d.ts","sourceRoot":"","sources":["../../../src/Api/UserEvent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserEventSystem.d.ts","sourceRoot":"","sources":["../../../src/Api/UserEventSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Api/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommonFields.d.ts","sourceRoot":"","sources":["../../src/CommonFields.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExIds.d.ts","sourceRoot":"","sources":["../../src/ExIds.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunnelStartedFields.d.ts","sourceRoot":"","sources":["../../src/FunnelStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,IAAI,EAAE,MAAM,CAAA;CACb"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { JsonObject } from '@xylabs/object';
|
|
2
|
+
import type { UserEvent } from './Api/index.js';
|
|
3
|
+
import { PixelApi } from './Api/index.js';
|
|
4
|
+
import type { ExIds } from './ExIds.js';
|
|
5
|
+
export declare class XyPixel {
|
|
6
|
+
static api: PixelApi;
|
|
7
|
+
private static _instance?;
|
|
8
|
+
private static utmFieldsObj;
|
|
9
|
+
cid: string;
|
|
10
|
+
email?: string;
|
|
11
|
+
email_hash?: string | null;
|
|
12
|
+
exids?: ExIds;
|
|
13
|
+
pixelId?: string;
|
|
14
|
+
queue: UserEvent[];
|
|
15
|
+
private queueMutex;
|
|
16
|
+
private constructor();
|
|
17
|
+
static get instance(): XyPixel;
|
|
18
|
+
static init(pixelId: string): XyPixel;
|
|
19
|
+
static selectApi(api: PixelApi): void;
|
|
20
|
+
private static utmFields;
|
|
21
|
+
identify(email?: string): void;
|
|
22
|
+
send<T extends JsonObject>(event: string, fields?: T, eventId?: string): Promise<void>;
|
|
23
|
+
private tryFlushQueue;
|
|
24
|
+
private updateFbId;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Pixel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Pixel.d.ts","sourceRoot":"","sources":["../../src/Pixel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAKhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAQvC,qBAAa,OAAO;IAClB,MAAM,CAAC,GAAG,WAAiB;IAE3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAW;IAEtC,GAAG,SAAwB;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,KAAK,EAAE,SAAS,EAAE,CAAK;IAEvB,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAKP,MAAM,KAAK,QAAQ,IAAI,OAAO,CAE7B;IAED,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;IAK3B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ;IAI9B,OAAO,CAAC,MAAM,CAAC,SAAS,CAKvB;IAED,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;IAQjB,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM;YAsB9D,aAAa;IAoB3B,OAAO,CAAC,UAAU;CAWnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PurchaseFields.d.ts","sourceRoot":"","sources":["../../src/PurchaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class Referrer {
|
|
2
|
+
private static storageId;
|
|
3
|
+
local: string;
|
|
4
|
+
session: string;
|
|
5
|
+
constructor();
|
|
6
|
+
toJson(): {
|
|
7
|
+
local: string;
|
|
8
|
+
session: string;
|
|
9
|
+
} | undefined;
|
|
10
|
+
private getFromLocal;
|
|
11
|
+
private getFromSession;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=Referrer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Referrer.d.ts","sourceRoot":"","sources":["../../src/Referrer.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAmB;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;;IAQf,MAAM;;;;IASN,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestStartedFields.d.ts","sourceRoot":"","sources":["../../src/TestStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAA;CACb"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UniqueUserId.d.ts","sourceRoot":"","sources":["../../src/UniqueUserId.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,EAAE,EAAE,MAAM,CAAA;;IAOV,QAAQ;IAIR,OAAO,CAAC,UAAU;CAGnB"}
|
|
@@ -0,0 +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;CACpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.js';
|
|
2
|
+
import type { TestStartedFields } from './TestStartedFields.js';
|
|
3
|
+
import type { UserClickFields } from './UserClickFields.js';
|
|
4
|
+
import type { ViewContentFields } from './ViewContentFields.js';
|
|
5
|
+
export declare abstract class UserEventHandler<T> {
|
|
6
|
+
abstract funnelStarted(fields: T | FunnelStartedFields): Promise<void>;
|
|
7
|
+
abstract testStarted(fields: T | TestStartedFields): Promise<void>;
|
|
8
|
+
abstract userClick(fields: T | UserClickFields): Promise<void>;
|
|
9
|
+
abstract viewContent(fields: T | ViewContentFields): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# 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,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,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IACtE,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9D,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CACnE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class UtmFields {
|
|
2
|
+
private static localStorageId;
|
|
3
|
+
fields: Record<string, string>[];
|
|
4
|
+
constructor();
|
|
5
|
+
getUtmRecord: () => Record<string, string> | null;
|
|
6
|
+
toString(): string;
|
|
7
|
+
update(): Record<string, string>[];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=UtmFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UtmFields.d.ts","sourceRoot":"","sources":["../../src/UtmFields.ts"],"names":[],"mappings":"AAEA,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAK;;IAgBrC,YAAY,sCAWX;IAED,QAAQ;IAKR,MAAM;CAOP"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewContentFields.d.ts","sourceRoot":"","sources":["../../src/ViewContentFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface XyLabsTrackingEventJson {
|
|
2
|
+
cid: string;
|
|
3
|
+
create_time?: number;
|
|
4
|
+
email?: string;
|
|
5
|
+
email_hash?: string;
|
|
6
|
+
event?: string;
|
|
7
|
+
event_id?: string;
|
|
8
|
+
exids?: Record<string, string>;
|
|
9
|
+
fields?: Record<string, unknown>;
|
|
10
|
+
host?: string;
|
|
11
|
+
ip?: string;
|
|
12
|
+
pathname?: string;
|
|
13
|
+
pixel?: string;
|
|
14
|
+
receive_time?: number;
|
|
15
|
+
rid?: string;
|
|
16
|
+
system?: unknown;
|
|
17
|
+
ua?: string;
|
|
18
|
+
uid?: string;
|
|
19
|
+
utm?: Record<string, string>[] | Record<string, string[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=XyLabsTrackingEventJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyLabsTrackingEventJson.d.ts","sourceRoot":"","sources":["../../src/XyLabsTrackingEventJson.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC1D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type EmptyObject } from '@xylabs/object';
|
|
2
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.js';
|
|
3
|
+
import type { PurchaseFields } from './PurchaseFields.ts';
|
|
4
|
+
import type { TestStartedFields } from './TestStartedFields.js';
|
|
5
|
+
import type { UserClickFields } from './UserClickFields.js';
|
|
6
|
+
import { UserEventHandler } from './UserEventHandler.js';
|
|
7
|
+
import type { ViewContentFields } from './ViewContentFields.js';
|
|
8
|
+
export declare class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {
|
|
9
|
+
constructor();
|
|
10
|
+
funnelStarted(fields: T | FunnelStartedFields): Promise<void>;
|
|
11
|
+
purchase(fields: T | PurchaseFields): Promise<void>;
|
|
12
|
+
testStarted(fields: T | TestStartedFields): Promise<void>;
|
|
13
|
+
userClick(fields: T | UserClickFields): Promise<void>;
|
|
14
|
+
viewContent(fields: T | ViewContentFields): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=XyUserEventHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XyUserEventHandler.d.ts","sourceRoot":"","sources":["../../src/XyUserEventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,gBAAgB,CAAA;AAE/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE/D,qBAAa,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;;IAKxF,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB;IAI7C,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc;IAInC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;IAIzC,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,eAAe;IAIrC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;CAGhD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSystemInfo.d.ts","sourceRoot":"","sources":["../../src/getSystemInfo.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAM3B,eAAO,MAAM,aAAa,8CAOzB,CAAA"}
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,155 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
interface UserEvent {
|
|
16
|
-
cid: string;
|
|
17
|
-
create_time?: number;
|
|
18
|
-
email?: string;
|
|
19
|
-
email_hash?: string;
|
|
20
|
-
event?: string;
|
|
21
|
-
event_id?: string;
|
|
22
|
-
exids?: ExIds;
|
|
23
|
-
fields?: Record<string, unknown>;
|
|
24
|
-
host?: string;
|
|
25
|
-
pathname?: string;
|
|
26
|
-
pixel?: string;
|
|
27
|
-
receive_time?: number;
|
|
28
|
-
referrer?: {
|
|
29
|
-
local: string;
|
|
30
|
-
session: string;
|
|
31
|
-
};
|
|
32
|
-
rid?: string;
|
|
33
|
-
system?: UserEventSystem;
|
|
34
|
-
uid?: string;
|
|
35
|
-
utm?: Record<string, string>[] | Record<string, string[]>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
declare class PixelApi {
|
|
39
|
-
private endPoint;
|
|
40
|
-
constructor(baseUri?: string);
|
|
41
|
-
trackEvents(events: UserEvent[]): Promise<any>;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
interface CommonFields extends Record<string, unknown> {
|
|
45
|
-
funnel?: string;
|
|
46
|
-
testData?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
interface FunnelStartedFields extends CommonFields {
|
|
50
|
-
name: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
declare class XyPixel {
|
|
54
|
-
static api: PixelApi;
|
|
55
|
-
private static _instance?;
|
|
56
|
-
private static utmFieldsObj;
|
|
57
|
-
cid: string;
|
|
58
|
-
email?: string;
|
|
59
|
-
email_hash?: string | null;
|
|
60
|
-
exids?: ExIds;
|
|
61
|
-
pixelId?: string;
|
|
62
|
-
queue: UserEvent[];
|
|
63
|
-
private queueMutex;
|
|
64
|
-
private constructor();
|
|
65
|
-
static get instance(): XyPixel;
|
|
66
|
-
static init(pixelId: string): XyPixel;
|
|
67
|
-
static selectApi(api: PixelApi): void;
|
|
68
|
-
private static utmFields;
|
|
69
|
-
identify(email?: string): void;
|
|
70
|
-
send<T extends Record<string, unknown>>(event: string, fields?: T, eventId?: string): Promise<void>;
|
|
71
|
-
private tryFlushQueue;
|
|
72
|
-
private updateFbId;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
declare class Referrer {
|
|
76
|
-
private static storageId;
|
|
77
|
-
local: string;
|
|
78
|
-
session: string;
|
|
79
|
-
constructor();
|
|
80
|
-
toJson(): {
|
|
81
|
-
local: string;
|
|
82
|
-
session: string;
|
|
83
|
-
} | undefined;
|
|
84
|
-
private getFromLocal;
|
|
85
|
-
private getFromSession;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
interface TestStartedFields extends CommonFields {
|
|
89
|
-
name: string;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
declare class UniqueUserId {
|
|
93
|
-
private static localStorageId;
|
|
94
|
-
id: string;
|
|
95
|
-
constructor();
|
|
96
|
-
toString(): string;
|
|
97
|
-
private generateId;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
interface UserClickFields extends CommonFields {
|
|
101
|
-
elementName: string;
|
|
102
|
-
elementType: string;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
interface ViewContentFields extends CommonFields {
|
|
106
|
-
name: string;
|
|
107
|
-
path: string;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
declare abstract class UserEventHandler<T> {
|
|
111
|
-
abstract funnelStarted(fields: T | FunnelStartedFields): Promise<void>;
|
|
112
|
-
abstract testStarted(fields: T | TestStartedFields): Promise<void>;
|
|
113
|
-
abstract userClick(fields: T | UserClickFields): Promise<void>;
|
|
114
|
-
abstract viewContent(fields: T | ViewContentFields): Promise<void>;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
declare class UtmFields {
|
|
118
|
-
private static localStorageId;
|
|
119
|
-
fields: Record<string, string>[];
|
|
120
|
-
constructor();
|
|
121
|
-
getUtmRecord: () => Record<string, string> | null;
|
|
122
|
-
toString(): string;
|
|
123
|
-
update(): Record<string, string>[];
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
interface XyLabsTrackingEventJson {
|
|
127
|
-
cid: string;
|
|
128
|
-
create_time?: number;
|
|
129
|
-
email?: string;
|
|
130
|
-
email_hash?: string;
|
|
131
|
-
event?: string;
|
|
132
|
-
event_id?: string;
|
|
133
|
-
exids?: Record<string, string>;
|
|
134
|
-
fields?: Record<string, unknown>;
|
|
135
|
-
host?: string;
|
|
136
|
-
ip?: string;
|
|
137
|
-
pathname?: string;
|
|
138
|
-
pixel?: string;
|
|
139
|
-
receive_time?: number;
|
|
140
|
-
rid?: string;
|
|
141
|
-
system?: unknown;
|
|
142
|
-
ua?: string;
|
|
143
|
-
uid?: string;
|
|
144
|
-
utm?: Record<string, string>[] | Record<string, string[]>;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
declare class XyUserEventHandler<T extends Record<string, unknown>> extends UserEventHandler<T> {
|
|
148
|
-
constructor();
|
|
149
|
-
funnelStarted(fields: T | FunnelStartedFields): Promise<void>;
|
|
150
|
-
testStarted(fields: T | TestStartedFields): Promise<void>;
|
|
151
|
-
userClick(fields: T | UserClickFields): Promise<void>;
|
|
152
|
-
viewContent(fields: T | ViewContentFields): Promise<void>;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export { type FunnelStartedFields, PixelApi, Referrer, type TestStartedFields, UniqueUserId, type UserClickFields, type UserEvent, UserEventHandler, type UserEventSystem, UtmFields, type ViewContentFields, type XyLabsTrackingEventJson, XyPixel, XyUserEventHandler };
|
|
1
|
+
export * from './Api/index.js';
|
|
2
|
+
export * from './FunnelStartedFields.js';
|
|
3
|
+
export * from './Pixel.js';
|
|
4
|
+
export * from './Referrer.js';
|
|
5
|
+
export * from './TestStartedFields.js';
|
|
6
|
+
export * from './UniqueUserId.js';
|
|
7
|
+
export * from './UserClickFields.js';
|
|
8
|
+
export * from './UserEventHandler.js';
|
|
9
|
+
export * from './UtmFields.js';
|
|
10
|
+
export * from './ViewContentFields.js';
|
|
11
|
+
export * from './XyLabsTrackingEventJson.js';
|
|
12
|
+
export * from './XyUserEventHandler.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA"}
|
package/dist/browser/index.mjs
CHANGED
|
@@ -247,6 +247,7 @@ var UserEventHandler = class {
|
|
|
247
247
|
};
|
|
248
248
|
|
|
249
249
|
// src/XyUserEventHandler.ts
|
|
250
|
+
import { toJsonObject } from "@xylabs/object";
|
|
250
251
|
var XyUserEventHandler = class extends UserEventHandler {
|
|
251
252
|
static {
|
|
252
253
|
__name(this, "XyUserEventHandler");
|
|
@@ -255,16 +256,19 @@ var XyUserEventHandler = class extends UserEventHandler {
|
|
|
255
256
|
super();
|
|
256
257
|
}
|
|
257
258
|
async funnelStarted(fields) {
|
|
258
|
-
return await XyPixel.instance.send("FunnelStarted", fields);
|
|
259
|
+
return await XyPixel.instance.send("FunnelStarted", toJsonObject(fields, [], 10));
|
|
260
|
+
}
|
|
261
|
+
async purchase(fields) {
|
|
262
|
+
return await XyPixel.instance.send("Purchase", toJsonObject(fields, [], 10));
|
|
259
263
|
}
|
|
260
264
|
async testStarted(fields) {
|
|
261
|
-
return await XyPixel.instance.send("TestStarted", fields);
|
|
265
|
+
return await XyPixel.instance.send("TestStarted", toJsonObject(fields, [], 10));
|
|
262
266
|
}
|
|
263
267
|
async userClick(fields) {
|
|
264
|
-
return await XyPixel.instance.send("ViewPage", fields);
|
|
268
|
+
return await XyPixel.instance.send("ViewPage", toJsonObject(fields, [], 10));
|
|
265
269
|
}
|
|
266
270
|
async viewContent(fields) {
|
|
267
|
-
return await XyPixel.instance.send("ViewContent", fields);
|
|
271
|
+
return await XyPixel.instance.send("ViewContent", toJsonObject(fields, [], 10));
|
|
268
272
|
}
|
|
269
273
|
};
|
|
270
274
|
export {
|
|
@@ -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 { 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 { Mutex } from 'async-mutex'\nimport Cookies from 'js-cookie'\nimport md5 from 'spark-md5'\n\nimport { PixelApi, UserEvent } from './Api/index.js'\nimport { 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 Record<string, unknown>>(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 { 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 { FunnelStartedFields } from './FunnelStartedFields.js'\nimport { TestStartedFields } from './TestStartedFields.js'\nimport { UserClickFields } from './UserClickFields.js'\nimport { ViewContentFields } from './ViewContentFields.js'\n\nexport abstract class UserEventHandler<T> {\n abstract funnelStarted(fields: T | FunnelStartedFields): Promise<void>\n abstract testStarted(fields: T | TestStartedFields): Promise<void>\n abstract userClick(fields: T | UserClickFields): Promise<void>\n abstract viewContent(fields: T | ViewContentFields): Promise<void>\n}\n","import { FunnelStartedFields } from './FunnelStartedFields.js'\nimport { XyPixel } from './Pixel.js'\nimport { TestStartedFields } from './TestStartedFields.js'\nimport { UserClickFields } from './UserClickFields.js'\nimport { UserEventHandler } from './UserEventHandler.js'\nimport { ViewContentFields } from './ViewContentFields.js'\n\nexport class XyUserEventHandler<T extends Record<string, unknown>> extends UserEventHandler<T> {\n constructor() {\n super()\n }\n\n async funnelStarted(fields: T | FunnelStartedFields) {\n return await XyPixel.instance.send('FunnelStarted', fields)\n }\n\n async testStarted(fields: T | TestStartedFields) {\n return await XyPixel.instance.send('TestStarted', fields)\n }\n\n async userClick(fields: T | UserClickFields) {\n return await XyPixel.instance.send('ViewPage', fields)\n }\n\n async viewContent(fields: T | ViewContentFields) {\n return await XyPixel.instance.send('ViewContent', fields)\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","XyUserEventHandler","UserEventHandler","constructor","funnelStarted","fields","XyPixel","instance","send","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.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 { 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<T> {\n abstract funnelStarted(fields: T | FunnelStartedFields): Promise<void>\n abstract testStarted(fields: T | TestStartedFields): Promise<void>\n abstract userClick(fields: T | UserClickFields): Promise<void>\n abstract viewContent(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"]}
|
package/eslint.config.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// eslint.config.mjs
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
config as xylabsConfig, rulesConfig, importConfig,
|
|
5
|
+
} from '@xylabs/eslint-config-flat'
|
|
4
6
|
|
|
5
7
|
export default [
|
|
6
|
-
{
|
|
7
|
-
ignores: ['.yarn/**', 'jest.config.cjs', '**/dist/**', 'dist', 'build/**', 'node_modules/**'],
|
|
8
|
-
},
|
|
8
|
+
{ ignores: ['.yarn/**', 'jest.config.cjs', '**/dist/**', 'dist', 'build/**', 'node_modules/**', 'eslint.config.mjs'] },
|
|
9
9
|
...xylabsConfig,
|
|
10
10
|
{
|
|
11
11
|
rules: {
|
|
@@ -37,7 +37,7 @@ export default [
|
|
|
37
37
|
...importConfig,
|
|
38
38
|
rules: {
|
|
39
39
|
...importConfig.rules,
|
|
40
|
-
'import-x/no-cycle': ['warn', { maxDepth: 5 }]
|
|
41
|
-
}
|
|
42
|
-
}
|
|
40
|
+
'import-x/no-cycle': ['warn', { maxDepth: 5 }],
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
43
|
]
|
package/package.json
CHANGED
|
@@ -1,71 +1,72 @@
|
|
|
1
1
|
{
|
|
2
|
+
"name": "@xylabs/pixel",
|
|
3
|
+
"version": "2.0.2",
|
|
4
|
+
"description": "Event Client for xylabs ESB",
|
|
5
|
+
"homepage": "https://xylabs.com",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "git+https://github.com/xylabs/sdk-pixel-js/issues",
|
|
8
|
+
"email": "support@xylabs.com"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/xylabs/sdk-pixel-js.git"
|
|
13
|
+
},
|
|
14
|
+
"license": "LGPL-3.0-or-later",
|
|
2
15
|
"author": {
|
|
3
|
-
"email": "support@xylabs.com",
|
|
4
16
|
"name": "XY Labs Development Team",
|
|
17
|
+
"email": "support@xylabs.com",
|
|
5
18
|
"url": "https://xylabs.com"
|
|
6
19
|
},
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"type": "module",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": {
|
|
24
|
+
"types": "./dist/browser/index.d.ts",
|
|
25
|
+
"default": "./dist/browser/index.mjs"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
10
28
|
},
|
|
29
|
+
"module": "dist/browser/index.mjs",
|
|
30
|
+
"types": "dist/browser/index.d.ts",
|
|
11
31
|
"dependencies": {
|
|
12
|
-
"@xylabs/assert": "^4.0.
|
|
32
|
+
"@xylabs/assert": "^4.0.10",
|
|
33
|
+
"@xylabs/object": "^4.0.10",
|
|
13
34
|
"async-mutex": "^0.5.0",
|
|
14
|
-
"axios": "^1.7.
|
|
35
|
+
"axios": "^1.7.7",
|
|
15
36
|
"bowser": "^2.11.0",
|
|
16
37
|
"fast-deep-equal": "^3.1.3",
|
|
17
38
|
"js-cookie": "^3.0.5",
|
|
18
39
|
"spark-md5": "^3.0.2"
|
|
19
40
|
},
|
|
20
|
-
"description": "Event Client for xylabs ESB",
|
|
21
41
|
"devDependencies": {
|
|
22
42
|
"@types/jest": "^29.5.12",
|
|
23
43
|
"@types/js-cookie": "^3.0.6",
|
|
24
44
|
"@types/jsdom": "^21.1.7",
|
|
25
45
|
"@types/lodash-es": "^4.17.12",
|
|
26
|
-
"@types/node": "^22.
|
|
46
|
+
"@types/node": "^22.5.4",
|
|
27
47
|
"@types/randombytes": "^2.0.3",
|
|
28
48
|
"@types/spark-md5": "^3.0.4",
|
|
29
|
-
"@xylabs/eslint-config-flat": "^4.0.
|
|
30
|
-
"@xylabs/ts-scripts-yarn3": "^4.0.
|
|
31
|
-
"@xylabs/tsconfig-dom": "^4.0.
|
|
32
|
-
"@xylabs/tsconfig-dom-jest": "^4.0.
|
|
33
|
-
"@xylabs/tsconfig-jest": "^4.0.
|
|
34
|
-
"axios": "^1.7.
|
|
49
|
+
"@xylabs/eslint-config-flat": "^4.0.7",
|
|
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",
|
|
35
55
|
"dotenv": "^16.4.5",
|
|
36
|
-
"eslint": "^9.9.
|
|
37
|
-
"eslint-import-resolver-typescript": "^3.6.
|
|
56
|
+
"eslint": "^9.9.1",
|
|
57
|
+
"eslint-import-resolver-typescript": "^3.6.3",
|
|
38
58
|
"jest": "^29.7.0",
|
|
39
59
|
"jest-environment-jsdom": "^29.7.0",
|
|
40
|
-
"jsdom": "^
|
|
60
|
+
"jsdom": "^25.0.0",
|
|
41
61
|
"npm-package-json-lint": "^8.0.0",
|
|
42
62
|
"reflect-metadata": "^0.2.2",
|
|
43
|
-
"ts-jest": "^29.2.
|
|
63
|
+
"ts-jest": "^29.2.5",
|
|
44
64
|
"ts-node": "^10.9.2",
|
|
45
65
|
"typescript": "^5.5.4",
|
|
46
66
|
"vitest": "^2.0.5"
|
|
47
67
|
},
|
|
48
|
-
"
|
|
49
|
-
"exports": {
|
|
50
|
-
".": {
|
|
51
|
-
"types": "./dist/browser/index.d.ts",
|
|
52
|
-
"default": "./dist/browser/index.mjs"
|
|
53
|
-
},
|
|
54
|
-
"./package.json": "./package.json"
|
|
55
|
-
},
|
|
56
|
-
"module": "dist/browser/index.mjs",
|
|
57
|
-
"homepage": "https://xylabs.com",
|
|
58
|
-
"license": "LGPL-3.0-or-later",
|
|
59
|
-
"name": "@xylabs/pixel",
|
|
68
|
+
"packageManager": "yarn@4.4.0",
|
|
60
69
|
"publishConfig": {
|
|
61
70
|
"access": "public"
|
|
62
|
-
}
|
|
63
|
-
"repository": {
|
|
64
|
-
"type": "git",
|
|
65
|
-
"url": "https://github.com/xylabs/sdk-pixel-js.git"
|
|
66
|
-
},
|
|
67
|
-
"sideEffects": false,
|
|
68
|
-
"version": "2.0.1",
|
|
69
|
-
"packageManager": "yarn@4.4.0",
|
|
70
|
-
"type": "module"
|
|
71
|
+
}
|
|
71
72
|
}
|
package/src/Api/Api.ts
CHANGED
package/src/Api/UserEvent.ts
CHANGED
package/src/CommonFields.ts
CHANGED
package/src/Pixel.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
+
import type { JsonObject } from '@xylabs/object'
|
|
2
3
|
import { Mutex } from 'async-mutex'
|
|
3
4
|
import Cookies from 'js-cookie'
|
|
4
5
|
import md5 from 'spark-md5'
|
|
5
6
|
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
7
|
+
import type { UserEvent } from './Api/index.js'
|
|
8
|
+
import { PixelApi } from './Api/index.js'
|
|
9
|
+
import type { ExIds } from './ExIds.js'
|
|
8
10
|
import { getSystemInfo } from './getSystemInfo.js'
|
|
9
11
|
import { Referrer } from './Referrer.js'
|
|
10
12
|
import { UniqueUserId } from './UniqueUserId.js'
|
|
@@ -61,7 +63,7 @@ export class XyPixel {
|
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
async send<T extends
|
|
66
|
+
async send<T extends JsonObject>(event: string, fields?: T, eventId?: string) {
|
|
65
67
|
this.updateFbId()
|
|
66
68
|
const utm = XyPixel.utmFields().update()
|
|
67
69
|
const referrer = new Referrer()
|
package/src/TestStartedFields.ts
CHANGED
package/src/UserClickFields.ts
CHANGED
package/src/UserEventHandler.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FunnelStartedFields } from './FunnelStartedFields.js'
|
|
2
|
-
import { TestStartedFields } from './TestStartedFields.js'
|
|
3
|
-
import { UserClickFields } from './UserClickFields.js'
|
|
4
|
-
import { ViewContentFields } from './ViewContentFields.js'
|
|
1
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.js'
|
|
2
|
+
import type { TestStartedFields } from './TestStartedFields.js'
|
|
3
|
+
import type { UserClickFields } from './UserClickFields.js'
|
|
4
|
+
import type { ViewContentFields } from './ViewContentFields.js'
|
|
5
5
|
|
|
6
6
|
export abstract class UserEventHandler<T> {
|
|
7
7
|
abstract funnelStarted(fields: T | FunnelStartedFields): Promise<void>
|
package/src/ViewContentFields.ts
CHANGED
|
@@ -1,28 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type EmptyObject, toJsonObject } from '@xylabs/object'
|
|
2
|
+
|
|
3
|
+
import type { FunnelStartedFields } from './FunnelStartedFields.js'
|
|
2
4
|
import { XyPixel } from './Pixel.js'
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
+
import type { PurchaseFields } from './PurchaseFields.ts'
|
|
6
|
+
import type { TestStartedFields } from './TestStartedFields.js'
|
|
7
|
+
import type { UserClickFields } from './UserClickFields.js'
|
|
5
8
|
import { UserEventHandler } from './UserEventHandler.js'
|
|
6
|
-
import { ViewContentFields } from './ViewContentFields.js'
|
|
9
|
+
import type { ViewContentFields } from './ViewContentFields.js'
|
|
7
10
|
|
|
8
|
-
export class XyUserEventHandler<T extends
|
|
11
|
+
export class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {
|
|
9
12
|
constructor() {
|
|
10
13
|
super()
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
async funnelStarted(fields: T | FunnelStartedFields) {
|
|
14
|
-
return await XyPixel.instance.send('FunnelStarted', fields)
|
|
17
|
+
return await XyPixel.instance.send('FunnelStarted', toJsonObject(fields, [], 10))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async purchase(fields: T | PurchaseFields) {
|
|
21
|
+
return await XyPixel.instance.send('Purchase', toJsonObject(fields, [], 10))
|
|
15
22
|
}
|
|
16
23
|
|
|
17
24
|
async testStarted(fields: T | TestStartedFields) {
|
|
18
|
-
return await XyPixel.instance.send('TestStarted', fields)
|
|
25
|
+
return await XyPixel.instance.send('TestStarted', toJsonObject(fields, [], 10))
|
|
19
26
|
}
|
|
20
27
|
|
|
21
28
|
async userClick(fields: T | UserClickFields) {
|
|
22
|
-
return await XyPixel.instance.send('ViewPage', fields)
|
|
29
|
+
return await XyPixel.instance.send('ViewPage', toJsonObject(fields, [], 10))
|
|
23
30
|
}
|
|
24
31
|
|
|
25
32
|
async viewContent(fields: T | ViewContentFields) {
|
|
26
|
-
return await XyPixel.instance.send('ViewContent', fields)
|
|
33
|
+
return await XyPixel.instance.send('ViewContent', toJsonObject(fields, [], 10))
|
|
27
34
|
}
|
|
28
35
|
}
|
package/src/getSystemInfo.ts
CHANGED
package/xy.config.ts
CHANGED