@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.
Files changed (58) hide show
  1. package/dist/browser/Api/Api.d.ts +7 -0
  2. package/dist/browser/Api/Api.d.ts.map +1 -0
  3. package/dist/browser/Api/UserEvent.d.ts +25 -0
  4. package/dist/browser/Api/UserEvent.d.ts.map +1 -0
  5. package/dist/browser/Api/UserEventSystem.d.ts +3 -0
  6. package/dist/browser/Api/UserEventSystem.d.ts.map +1 -0
  7. package/dist/browser/Api/index.d.ts +4 -0
  8. package/dist/browser/Api/index.d.ts.map +1 -0
  9. package/dist/browser/CommonFields.d.ts +5 -0
  10. package/dist/browser/CommonFields.d.ts.map +1 -0
  11. package/dist/browser/ExIds.d.ts +10 -0
  12. package/dist/browser/ExIds.d.ts.map +1 -0
  13. package/dist/browser/FunnelStartedFields.d.ts +5 -0
  14. package/dist/browser/FunnelStartedFields.d.ts.map +1 -0
  15. package/dist/browser/Pixel.d.ts +26 -0
  16. package/dist/browser/Pixel.d.ts.map +1 -0
  17. package/dist/browser/PurchaseFields.d.ts +8 -0
  18. package/dist/browser/PurchaseFields.d.ts.map +1 -0
  19. package/dist/browser/Referrer.d.ts +13 -0
  20. package/dist/browser/Referrer.d.ts.map +1 -0
  21. package/dist/browser/TestStartedFields.d.ts +5 -0
  22. package/dist/browser/TestStartedFields.d.ts.map +1 -0
  23. package/dist/browser/UniqueUserId.d.ts +8 -0
  24. package/dist/browser/UniqueUserId.d.ts.map +1 -0
  25. package/dist/browser/UserClickFields.d.ts +6 -0
  26. package/dist/browser/UserClickFields.d.ts.map +1 -0
  27. package/dist/browser/UserEventHandler.d.ts +11 -0
  28. package/dist/browser/UserEventHandler.d.ts.map +1 -0
  29. package/dist/browser/UtmFields.d.ts +9 -0
  30. package/dist/browser/UtmFields.d.ts.map +1 -0
  31. package/dist/browser/ViewContentFields.d.ts +6 -0
  32. package/dist/browser/ViewContentFields.d.ts.map +1 -0
  33. package/dist/browser/XyLabsTrackingEventJson.d.ts +21 -0
  34. package/dist/browser/XyLabsTrackingEventJson.d.ts.map +1 -0
  35. package/dist/browser/XyUserEventHandler.d.ts +16 -0
  36. package/dist/browser/XyUserEventHandler.d.ts.map +1 -0
  37. package/dist/browser/getSystemInfo.d.ts +3 -0
  38. package/dist/browser/getSystemInfo.d.ts.map +1 -0
  39. package/dist/browser/index.d.ts +13 -155
  40. package/dist/browser/index.d.ts.map +1 -0
  41. package/dist/browser/index.mjs +8 -4
  42. package/dist/browser/index.mjs.map +1 -1
  43. package/eslint.config.mjs +7 -7
  44. package/package.json +40 -39
  45. package/src/Api/Api.ts +1 -1
  46. package/src/Api/UserEvent.ts +2 -2
  47. package/src/Api/UserEventSystem.ts +1 -1
  48. package/src/CommonFields.ts +1 -1
  49. package/src/FunnelStartedFields.ts +1 -1
  50. package/src/Pixel.ts +5 -3
  51. package/src/PurchaseFields.ts +8 -0
  52. package/src/TestStartedFields.ts +1 -1
  53. package/src/UserClickFields.ts +1 -1
  54. package/src/UserEventHandler.ts +4 -4
  55. package/src/ViewContentFields.ts +1 -1
  56. package/src/XyUserEventHandler.ts +16 -9
  57. package/src/getSystemInfo.ts +1 -1
  58. package/xy.config.ts +1 -1
@@ -0,0 +1,7 @@
1
+ import type { UserEvent } from './UserEvent.js';
2
+ export declare class PixelApi {
3
+ private endPoint;
4
+ constructor(baseUri?: string);
5
+ trackEvents(events: UserEvent[]): Promise<any>;
6
+ }
7
+ //# sourceMappingURL=Api.d.ts.map
@@ -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,3 @@
1
+ import type Bowser from 'bowser';
2
+ export type UserEventSystem = Bowser.Parser.ParsedResult;
3
+ //# sourceMappingURL=UserEventSystem.d.ts.map
@@ -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,4 @@
1
+ export * from './Api.js';
2
+ export * from './UserEvent.js';
3
+ export * from './UserEventSystem.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ export interface CommonFields {
2
+ funnel?: string;
3
+ testData?: string;
4
+ }
5
+ //# sourceMappingURL=CommonFields.d.ts.map
@@ -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,10 @@
1
+ export interface ExIds {
2
+ fbc?: string;
3
+ fbp?: string;
4
+ ga?: string;
5
+ gclid?: string;
6
+ rdt_uid?: string;
7
+ scid?: string;
8
+ tt_sessionId?: string;
9
+ }
10
+ //# sourceMappingURL=ExIds.d.ts.map
@@ -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,5 @@
1
+ import type { CommonFields } from './CommonFields.js';
2
+ export interface FunnelStartedFields extends CommonFields {
3
+ name: string;
4
+ }
5
+ //# sourceMappingURL=FunnelStartedFields.d.ts.map
@@ -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,8 @@
1
+ import type { CommonFields } from './CommonFields.js';
2
+ export interface PurchaseFields extends CommonFields {
3
+ id: string;
4
+ name?: string;
5
+ price?: number;
6
+ value?: number;
7
+ }
8
+ //# sourceMappingURL=PurchaseFields.d.ts.map
@@ -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,5 @@
1
+ import type { CommonFields } from './CommonFields.js';
2
+ export interface TestStartedFields extends CommonFields {
3
+ name: string;
4
+ }
5
+ //# sourceMappingURL=TestStartedFields.d.ts.map
@@ -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,8 @@
1
+ export declare class UniqueUserId {
2
+ private static localStorageId;
3
+ id: string;
4
+ constructor();
5
+ toString(): string;
6
+ private generateId;
7
+ }
8
+ //# sourceMappingURL=UniqueUserId.d.ts.map
@@ -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,6 @@
1
+ import type { CommonFields } from './CommonFields.js';
2
+ export interface UserClickFields extends CommonFields {
3
+ elementName: string;
4
+ elementType: string;
5
+ }
6
+ //# sourceMappingURL=UserClickFields.d.ts.map
@@ -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,6 @@
1
+ import type { CommonFields } from './CommonFields.js';
2
+ export interface ViewContentFields extends CommonFields {
3
+ name: string;
4
+ path: string;
5
+ }
6
+ //# sourceMappingURL=ViewContentFields.d.ts.map
@@ -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,3 @@
1
+ import Bowser from 'bowser';
2
+ export declare const getSystemInfo: () => Bowser.Parser.ParsedResult | undefined;
3
+ //# sourceMappingURL=getSystemInfo.d.ts.map
@@ -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"}
@@ -1,155 +1,13 @@
1
- import Bowser from 'bowser';
2
-
3
- interface ExIds {
4
- fbc?: string;
5
- fbp?: string;
6
- ga?: string;
7
- gclid?: string;
8
- rdt_uid?: string;
9
- scid?: string;
10
- tt_sessionId?: string;
11
- }
12
-
13
- type UserEventSystem = Bowser.Parser.ParsedResult;
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"}
@@ -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 { config as xylabsConfig, rulesConfig, importConfig } from '@xylabs/eslint-config-flat'
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
- "bugs": {
8
- "email": "support@xylabs.com",
9
- "url": "https://github.com/xylabs/sdk-pixel-js/issues"
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.1",
32
+ "@xylabs/assert": "^4.0.10",
33
+ "@xylabs/object": "^4.0.10",
13
34
  "async-mutex": "^0.5.0",
14
- "axios": "^1.7.4",
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.3.0",
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.0-rc.15",
30
- "@xylabs/ts-scripts-yarn3": "^4.0.0-rc.15",
31
- "@xylabs/tsconfig-dom": "^4.0.0-rc.15",
32
- "@xylabs/tsconfig-dom-jest": "^4.0.0-rc.15",
33
- "@xylabs/tsconfig-jest": "^4.0.0-rc.15",
34
- "axios": "^1.7.4",
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.0",
37
- "eslint-import-resolver-typescript": "^3.6.1",
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": "^24.1.1",
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.4",
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
- "types": "dist/browser/index.d.ts",
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
@@ -1,6 +1,6 @@
1
1
  import axios from 'axios'
2
2
 
3
- import { UserEvent } from './UserEvent.js'
3
+ import type { UserEvent } from './UserEvent.js'
4
4
 
5
5
  const apiBaseUri: Record<string, string> = {
6
6
  beta: 'https://pixel.xylabs.com',
@@ -1,5 +1,5 @@
1
- import { ExIds } from '../ExIds.js'
2
- import { UserEventSystem } from './UserEventSystem.js'
1
+ import type { ExIds } from '../ExIds.js'
2
+ import type { UserEventSystem } from './UserEventSystem.js'
3
3
 
4
4
  export interface UserEvent {
5
5
  cid: string
@@ -1,3 +1,3 @@
1
- import Bowser from 'bowser'
1
+ import type Bowser from 'bowser'
2
2
 
3
3
  export type UserEventSystem = Bowser.Parser.ParsedResult
@@ -1,4 +1,4 @@
1
- export interface CommonFields extends Record<string, unknown> {
1
+ export interface CommonFields {
2
2
  funnel?: string
3
3
  testData?: string
4
4
  }
@@ -1,4 +1,4 @@
1
- import { CommonFields } from './CommonFields.js'
1
+ import type { CommonFields } from './CommonFields.js'
2
2
 
3
3
  export interface FunnelStartedFields extends CommonFields {
4
4
  name: string
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 { PixelApi, UserEvent } from './Api/index.js'
7
- import { ExIds } from './ExIds.js'
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 Record<string, unknown>>(event: string, fields?: T, eventId?: string) {
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()
@@ -0,0 +1,8 @@
1
+ import type { CommonFields } from './CommonFields.js'
2
+
3
+ export interface PurchaseFields extends CommonFields {
4
+ id: string
5
+ name?: string
6
+ price?: number
7
+ value?: number
8
+ }
@@ -1,4 +1,4 @@
1
- import { CommonFields } from './CommonFields.js'
1
+ import type { CommonFields } from './CommonFields.js'
2
2
 
3
3
  export interface TestStartedFields extends CommonFields {
4
4
  name: string
@@ -1,4 +1,4 @@
1
- import { CommonFields } from './CommonFields.js'
1
+ import type { CommonFields } from './CommonFields.js'
2
2
 
3
3
  export interface UserClickFields extends CommonFields {
4
4
  elementName: string
@@ -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>
@@ -1,4 +1,4 @@
1
- import { CommonFields } from './CommonFields.js'
1
+ import type { CommonFields } from './CommonFields.js'
2
2
 
3
3
  export interface ViewContentFields extends CommonFields {
4
4
  name: string
@@ -1,28 +1,35 @@
1
- import { FunnelStartedFields } from './FunnelStartedFields.js'
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 { TestStartedFields } from './TestStartedFields.js'
4
- import { UserClickFields } from './UserClickFields.js'
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 Record<string, unknown>> extends UserEventHandler<T> {
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
  }
@@ -1,6 +1,6 @@
1
1
  import Bowser from 'bowser'
2
2
 
3
- import { UserEventSystem } from './Api/index.js'
3
+ import type { UserEventSystem } from './Api/index.js'
4
4
 
5
5
  let systemInfo: UserEventSystem | undefined
6
6
 
package/xy.config.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
1
+ import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
2
  const config: XyTsupConfig = {
3
3
  compile: {
4
4
  browser: { src: true },