@ariestools/pixel
Advanced tools
@@ -5,2 +5,3 @@ import type { UserEvent } from './UserEvent.ts'; | ||
| private endPoint; | ||
| /** Resolves a named environment or uses the supplied endpoint URI directly. */ | ||
| constructor(baseUri?: string); | ||
@@ -7,0 +8,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../../src/Api/Api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAQ/C,wEAAwE;AACxE,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAQ;gBAGZ,OAAO,SAAS;IAI5B;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE;CAItC"} | ||
| {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../../src/Api/Api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAQ/C,wEAAwE;AACxE,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAQ;IAGxB,+EAA+E;gBACnE,OAAO,SAAS;IAI5B;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE;CAItC"} |
@@ -5,14 +5,27 @@ import type { ExIds } from '../ExIds.ts'; | ||
| export interface UserEvent { | ||
| /** Persistent client identifier. */ | ||
| cid: string; | ||
| /** Client-side creation timestamp in Unix milliseconds. */ | ||
| create_time?: number; | ||
| /** Raw email when intentionally supplied to the tracking API. */ | ||
| email?: string; | ||
| /** Hashed email used for pseudonymous matching. */ | ||
| email_hash?: string; | ||
| /** Event type or name. */ | ||
| event?: string; | ||
| /** Caller-provided event identifier for correlation or deduplication. */ | ||
| event_id?: string; | ||
| /** External advertising and analytics identifiers. */ | ||
| exids?: ExIds; | ||
| /** Event-specific attributes. */ | ||
| fields?: Record<string, unknown>; | ||
| /** Browser location host at event creation. */ | ||
| host?: string; | ||
| /** Browser location path at event creation. */ | ||
| pathname?: string; | ||
| /** Pixel configuration identifier. */ | ||
| pixel?: string; | ||
| /** Server-side receipt timestamp in Unix milliseconds. */ | ||
| receive_time?: number; | ||
| /** Persisted local and session referrer values. */ | ||
| referrer?: { | ||
@@ -22,7 +35,11 @@ local: string; | ||
| }; | ||
| /** Request or record identifier assigned by the receiving system. */ | ||
| rid?: string; | ||
| /** Parsed browser, engine, operating-system, and platform metadata. */ | ||
| system?: UserEventSystem; | ||
| /** User identifier supplied by the caller or receiving system. */ | ||
| uid?: string; | ||
| /** Current or historical UTM campaign parameters. */ | ||
| utm?: Record<string, string>[] | Record<string, string[]>; | ||
| } | ||
| //# sourceMappingURL=UserEvent.d.ts.map |
@@ -1,1 +0,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,2EAA2E;AAC3E,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"} | ||
| {"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,2EAA2E;AAC3E,MAAM,WAAW,SAAS;IACxB,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,kEAAkE;IAClE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC1D"} |
@@ -0,17 +1,31 @@ | ||
| /** Browser identity parsed from a user-agent string. */ | ||
| export interface UserEventSystemBrowser { | ||
| /** Browser family name. */ | ||
| name?: string; | ||
| /** Browser version string. */ | ||
| version?: string; | ||
| } | ||
| /** Rendering or JavaScript engine identity parsed from a user agent. */ | ||
| export interface UserEventSystemEngine { | ||
| /** Engine family name. */ | ||
| name?: string; | ||
| /** Engine version string. */ | ||
| version?: string; | ||
| } | ||
| /** Operating-system identity parsed from a user agent. */ | ||
| export interface UserEventSystemOS { | ||
| /** Operating-system family name. */ | ||
| name?: string; | ||
| /** Operating-system version string. */ | ||
| version?: string; | ||
| /** Human-readable operating-system release name. */ | ||
| versionName?: string; | ||
| } | ||
| /** Device platform identity parsed from a user-agent string. */ | ||
| export interface UserEventSystemPlatform { | ||
| /** Device model when reported. */ | ||
| model?: string; | ||
| /** Platform category, such as desktop or mobile. */ | ||
| type?: string; | ||
| /** Device or platform vendor. */ | ||
| vendor?: string; | ||
@@ -21,7 +35,11 @@ } | ||
| export interface UserEventSystem { | ||
| /** Parsed browser identity. */ | ||
| browser?: UserEventSystemBrowser; | ||
| /** Parsed rendering or JavaScript engine identity. */ | ||
| engine?: UserEventSystemEngine; | ||
| /** Parsed operating-system identity. */ | ||
| os?: UserEventSystemOS; | ||
| /** Parsed device platform identity. */ | ||
| platform?: UserEventSystemPlatform; | ||
| } | ||
| //# sourceMappingURL=UserEventSystem.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"UserEventSystem.d.ts","sourceRoot":"","sources":["../../../src/Api/UserEventSystem.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,MAAM,CAAC,EAAE,qBAAqB,CAAA;IAC9B,EAAE,CAAC,EAAE,iBAAiB,CAAA;IACtB,QAAQ,CAAC,EAAE,uBAAuB,CAAA;CACnC"} | ||
| {"version":3,"file":"UserEventSystem.d.ts","sourceRoot":"","sources":["../../../src/Api/UserEventSystem.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACrC,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,gEAAgE;AAChE,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,OAAO,CAAC,EAAE,sBAAsB,CAAA;IAChC,sDAAsD;IACtD,MAAM,CAAC,EAAE,qBAAqB,CAAA;IAC9B,wCAAwC;IACxC,EAAE,CAAC,EAAE,iBAAiB,CAAA;IACtB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,uBAAuB,CAAA;CACnC"} |
| /** Common fields shared across all tracking event types. */ | ||
| export interface CommonFields { | ||
| /** Funnel or journey identifier associated with the event. */ | ||
| funnel?: string; | ||
| /** Marker or payload used to distinguish test traffic. */ | ||
| testData?: string; | ||
| } | ||
| //# sourceMappingURL=CommonFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"CommonFields.d.ts","sourceRoot":"","sources":["../../src/CommonFields.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"} | ||
| {"version":3,"file":"CommonFields.d.ts","sourceRoot":"","sources":["../../src/CommonFields.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"} |
| /** External tracking identifiers from third-party cookies and sessions (Facebook, Google, TikTok, etc.). */ | ||
| export interface ExIds { | ||
| /** Facebook click identifier from the `_fbc` cookie. */ | ||
| fbc?: string; | ||
| /** Facebook browser identifier from the `_fbp` cookie. */ | ||
| fbp?: string; | ||
| /** Google Analytics client identifier from the `_ga` cookie. */ | ||
| ga?: string; | ||
| /** Google Ads click identifier from the `_gcl_aw` cookie. */ | ||
| gclid?: string; | ||
| /** Reddit Ads user identifier. */ | ||
| rdt_uid?: string; | ||
| /** Snapchat click identifier. */ | ||
| scid?: string; | ||
| /** TikTok session identifier. */ | ||
| tt_sessionId?: string; | ||
| } | ||
| //# sourceMappingURL=ExIds.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ExIds.d.ts","sourceRoot":"","sources":["../../src/ExIds.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,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"} | ||
| {"version":3,"file":"ExIds.d.ts","sourceRoot":"","sources":["../../src/ExIds.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,WAAW,KAAK;IACpB,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB"} |
| import type { CommonFields } from './CommonFields.ts'; | ||
| /** Fields for a funnel-started tracking event. */ | ||
| export interface FunnelStartedFields extends CommonFields { | ||
| /** Name of the funnel that the user entered. */ | ||
| name: string; | ||
| } | ||
| //# sourceMappingURL=FunnelStartedFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"FunnelStartedFields.d.ts","sourceRoot":"","sources":["../../src/FunnelStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,kDAAkD;AAClD,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,IAAI,EAAE,MAAM,CAAA;CACb"} | ||
| {"version":3,"file":"FunnelStartedFields.d.ts","sourceRoot":"","sources":["../../src/FunnelStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,kDAAkD;AAClD,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;CACb"} |
@@ -12,2 +12,3 @@ // src/Api/Api.ts | ||
| /* baseUri can either be a preset (prod, beta, local), or a specific URI */ | ||
| /** Resolves a named environment or uses the supplied endpoint URI directly. */ | ||
| constructor(baseUri = "prod") { | ||
@@ -262,4 +263,7 @@ this.endPoint = isUndefined(apiBaseUri[baseUri]) ? baseUri : `${apiBaseUri[baseUri]}/t/event/queue`; | ||
| static storageId = "_coin_referrer"; | ||
| /** Referrer persisted across browser sessions. */ | ||
| local; | ||
| /** Referrer persisted for the current browser session. */ | ||
| session; | ||
| /** Loads stored referrers, falling back to `document.referrer`, then persists them. */ | ||
| constructor() { | ||
@@ -300,3 +304,5 @@ this.session = this.getFromSession() ?? document.referrer; | ||
| static localStorageId = "_coin_cid"; | ||
| /** Persistent UUID associated with this browser profile. */ | ||
| id; | ||
| /** Loads the existing identifier or generates and persists a new UUID. */ | ||
| constructor() { | ||
@@ -326,3 +332,5 @@ this.id = globalThis.localStorage.getItem(_UniqueUserId.localStorageId) ?? this.generateId(); | ||
| static localStorageId = "_coin_utm"; | ||
| /** Ordered history of distinct UTM parameter records. */ | ||
| fields = []; | ||
| /** Loads stored history, captures current URL parameters, and persists the result. */ | ||
| constructor() { | ||
@@ -390,10 +398,17 @@ const storedString = globalThis.localStorage.getItem(_UtmFields.localStorageId) ?? "[]"; | ||
| var XyPixel = class _XyPixel { | ||
| /** Shared transport used to flush queued events. */ | ||
| static api = new PixelApi(); | ||
| static _instance; | ||
| static utmFieldsObj; | ||
| /** Persistent client identifier loaded from browser storage. */ | ||
| cid; | ||
| /** Raw email supplied through {@link identify}; not included by {@link send}. */ | ||
| email; | ||
| /** MD5 email hash persisted for event correlation. */ | ||
| email_hash; | ||
| /** External advertising and analytics identifiers refreshed before sending. */ | ||
| exids; | ||
| /** Pixel configuration identifier attached to emitted events. */ | ||
| pixelId; | ||
| /** Events awaiting a successful API flush. */ | ||
| queue = []; | ||
@@ -422,3 +437,2 @@ queueMutex = new Mutex(); | ||
| * Replaces the default PixelApi instance used for sending events. | ||
| * @param API - The PixelApi instance to use | ||
| */ | ||
@@ -508,2 +522,3 @@ static selectApi(api) { | ||
| var XyUserEventHandler = class extends UserEventHandler { | ||
| /** Creates a handler that delegates to the initialized pixel singleton. */ | ||
| constructor() { | ||
@@ -510,0 +525,0 @@ super(); |
| { | ||
| "version": 3, | ||
| "sources": ["../../src/Api/Api.ts", "../../src/Pixel.ts", "../../src/getSystemInfo.ts", "../../src/md5Raw.ts", "../../src/Referrer.ts", "../../src/UniqueUserId.ts", "../../src/UtmFields.ts", "../../src/UserEventHandler.ts", "../../src/XyUserEventHandler.ts"], | ||
| "sourcesContent": ["import { fetchJsonPost } from '@ariestools/sdk/fetch'\nimport { isUndefined } from '@ariestools/sdk/typeof'\n\nimport type { UserEvent } from './UserEvent.ts'\n\nconst apiBaseUri: Record<string, string> = {\n beta: 'https://pixel.xylabs.com',\n local: 'http://localhost:3030',\n prod: 'https://pixel.xylabs.com',\n}\n\n/** HTTP client for sending tracking events to the XY Labs pixel API. */\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 = isUndefined(apiBaseUri[baseUri]) ? baseUri : `${apiBaseUri[baseUri]}/t/event/queue`\n }\n\n /**\n * Sends an array of user events to the tracking API.\n * @param events - The events to submit\n * @returns The response data from the API\n */\n async trackEvents(events: UserEvent[]) {\n const response = await fetchJsonPost(this.endPoint, events)\n return response.data\n }\n}\n", "import { assertEx } from '@ariestools/sdk/assert'\nimport type { JsonObject } from '@ariestools/sdk/object'\nimport { Mutex } from 'async-mutex'\n\nimport type { UserEvent } from './Api/index.ts'\nimport { PixelApi } from './Api/index.ts'\nimport type { ExIds } from './ExIds.ts'\nimport { getSystemInfo } from './getSystemInfo.ts'\nimport { md5Raw } from './md5Raw.ts'\nimport { Referrer } from './Referrer.ts'\nimport { UniqueUserId } from './UniqueUserId.ts'\nimport { UtmFields } from './UtmFields.ts'\n\nconst emailHashLocalStorageName = 'xy_email_hash'\n\nconst getCookieValue = (name: string): string | undefined => {\n const encodedName = encodeURIComponent(name)\n const cookie = globalThis.document?.cookie\n if (cookie === undefined || cookie.length === 0) return undefined\n const cookies = cookie.split('; ')\n for (const item of cookies) {\n const separatorIndex = item.indexOf('=')\n const key = separatorIndex === -1 ? item : item.slice(0, separatorIndex)\n if (key === encodedName || key === name) {\n const value = separatorIndex === -1 ? '' : item.slice(separatorIndex + 1)\n return decodeURIComponent(value)\n }\n }\n}\n\n/** Singleton pixel tracker that queues and sends user events to the XY Labs tracking API. */\nexport class XyPixel {\n static api = new PixelApi()\n\n private static _instance?: XyPixel\n private static utmFieldsObj: UtmFields\n\n cid: string\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 const uniqueUserId = new UniqueUserId()\n this.cid = uniqueUserId.id\n this.pixelId = pixelId\n this.email_hash = localStorage.getItem(emailHashLocalStorageName)\n }\n\n /** Returns the singleton XyPixel instance, throwing if not yet initialized. */\n static get instance(): XyPixel {\n return assertEx(this._instance, () => 'XyPixel uninitialized')\n }\n\n /**\n * Initializes the XyPixel singleton with the given pixel ID.\n * @param pixelId - The pixel identifier for this tracking instance\n * @returns The newly created XyPixel instance\n */\n static init(pixelId: string) {\n this._instance = new XyPixel(pixelId)\n return this._instance\n }\n\n /**\n * Replaces the default PixelApi instance used for sending events.\n * @param API - The PixelApi instance to use\n */\n static selectApi(api: PixelApi) {\n this.api = api\n }\n\n private static utmFields = () => {\n this.utmFieldsObj ??= new UtmFields()\n return this.utmFieldsObj\n }\n\n /**\n * Associates an email address with this pixel instance, hashing it for privacy.\n * @param email - The email address to identify the user with\n */\n identify(email?: string) {\n this.email = email\n this.email_hash = (email !== undefined && email.length > 0) ? md5Raw(email) : undefined\n if (this.email_hash !== undefined) {\n localStorage.setItem(emailHashLocalStorageName, this.email_hash)\n }\n }\n\n /**\n * Queues a tracking event and attempts to flush the queue to the API.\n * @param event - The event name\n * @param fields - Optional event-specific fields\n * @param eventId - Optional unique event identifier\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 !== undefined) {\n const events = this.queue\n this.queue = []\n try {\n await api.trackEvents(events)\n } catch (ex) {\n if (events !== undefined) {\n // put it back since it failed\n this.queue = [...this.queue, ...events]\n }\n\n console.error(ex)\n }\n }\n })\n }\n\n private updateFbId() {\n this.exids = {\n fbc: getCookieValue('_fbc'),\n fbp: getCookieValue('_fbp'),\n ga: getCookieValue('_ga'),\n gclid: getCookieValue('_gcl_aw'),\n rdt_uid: getCookieValue('rdt_uid'),\n scid: getCookieValue('_scid'),\n tt_sessionId: sessionStorage.getItem('tt_sessionId') ?? undefined,\n }\n }\n}\n", "import type { UserEventSystem } from './Api/index.ts'\n\ninterface UserAgentBrand {\n brand: string\n version: string\n}\n\ninterface NavigatorUserAgentDataLike {\n brands?: UserAgentBrand[]\n mobile?: boolean\n platform?: string\n}\n\ntype NavigatorWithUserAgentData = Navigator & {\n userAgentData?: NavigatorUserAgentDataLike\n}\n\nconst cache: { systemInfo?: UserEventSystem } = {}\n\nconst firstMatch = (value: string, expressions: RegExp[]) => {\n for (const expression of expressions) {\n const match = expression.exec(value)\n if (match?.[1] !== undefined && match[1] !== '') return match[1].replaceAll('_', '.')\n }\n}\n\nconst browserFromUserAgentData = (userAgentData?: NavigatorUserAgentDataLike) => {\n const brands = userAgentData?.brands ?? []\n return brands.find(({ brand }) => !/not.?a.?brand/i.test(brand) && brand !== 'Chromium') ?? brands.find(({ brand }) => brand === 'Chromium')\n}\n\nconst parseBrowser = (userAgent: string, userAgentData?: NavigatorUserAgentDataLike): UserEventSystem['browser'] => {\n const brand = browserFromUserAgentData(userAgentData)\n if (brand !== undefined) return { name: brand.brand, version: brand.version }\n\n const browserParsers: [RegExp, string][] = [\n [/Edg\\/([\\d.]+)/, 'Microsoft Edge'],\n [/OPR\\/([\\d.]+)/, 'Opera'],\n [/Firefox\\/([\\d.]+)/, 'Firefox'],\n [/Chrome\\/([\\d.]+)/, 'Chrome'],\n [/Version\\/([\\d.]+).*Safari\\//, 'Safari'],\n ]\n\n for (const [expression, name] of browserParsers) {\n const version = firstMatch(userAgent, [expression])\n if (version !== undefined) return { name, version }\n }\n\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parseEngine = (userAgent: string): UserEventSystem['engine'] => {\n if (/Chrome\\/|Chromium\\/|Edg\\/|OPR\\//.test(userAgent)) {\n return { name: 'Blink' }\n }\n\n const webkitVersion = firstMatch(userAgent, [/AppleWebKit\\/([\\d.]+)/])\n if (webkitVersion !== undefined) return { name: 'WebKit', version: webkitVersion }\n\n const geckoVersion = firstMatch(userAgent, [/Gecko\\/([\\d.]+)/])\n if (geckoVersion !== undefined) return { name: 'Gecko', version: geckoVersion }\n\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parseOS = (userAgent: string, userAgentData?: NavigatorUserAgentDataLike): UserEventSystem['os'] => {\n const platform = userAgentData?.platform\n if (platform !== undefined && platform.length > 0) return { name: platform }\n\n const osParsers: [RegExp, string][] = [\n [/Windows NT ([\\d.]+)/, 'Windows'],\n [/Android ([\\d.]+)/, 'Android'],\n [/(?:iPhone|iPad|iPod).*OS ([\\d_]+)/, 'iOS'],\n [/Mac OS X ([\\d_]+)/, 'macOS'],\n ]\n\n for (const [expression, name] of osParsers) {\n const version = firstMatch(userAgent, [expression])\n if (version !== undefined) return { name, version }\n }\n\n if (userAgent.includes('Linux')) return { name: 'Linux' }\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parsePlatform = (navigator: NavigatorWithUserAgentData, userAgent: string): UserEventSystem['platform'] => {\n const type = navigator.userAgentData?.mobile === true || /Android|Mobi|iPhone|iPad|iPod/i.test(userAgent) ? 'mobile' : 'desktop'\n const platform = navigator.userAgentData?.platform\n const vendor = navigator.vendor ?? ''\n\n return {\n type,\n vendor: vendor.length > 0 ? vendor : platform,\n }\n}\n\nconst parseSystemInfo = (): UserEventSystem | undefined => {\n const navigator = globalThis.navigator as NavigatorWithUserAgentData | undefined\n const userAgent = navigator?.userAgent ?? ''\n\n if (navigator === undefined || (userAgent.length === 0 && navigator.userAgentData === undefined)) return undefined\n\n return {\n browser: parseBrowser(userAgent, navigator.userAgentData),\n engine: parseEngine(userAgent),\n os: parseOS(userAgent, navigator.userAgentData),\n platform: parsePlatform(navigator, userAgent),\n }\n}\n\n/**\n * Returns parsed browser, OS, and engine information from the user agent string.\n * Results are cached after the first call.\n * @returns The parsed system info, or undefined if parsing fails\n */\nexport const getSystemInfo = () => {\n try {\n cache.systemInfo ??= parseSystemInfo()\n } catch (ex) {\n console.log(`getSystemInfo Error: ${ex instanceof Error ? ex.message : String(ex)}`)\n }\n return cache.systemInfo\n}\n", "interface Md5State {\n a: number\n b: number\n c: number\n d: number\n}\n\nconst shiftAmounts = [\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n]\n\nconst constants = Array.from(\n { length: 64 },\n (_, index) => Math.trunc(Math.abs(Math.sin(index + 1)) * 4_294_967_296) >>> 0,\n)\n\nconst initialState: Md5State = {\n a: 1_732_584_193,\n b: 4_023_233_417,\n c: 2_562_383_102,\n d: 271_733_878,\n}\n\nconst leftRotate = (value: number, shift: number) => ((value << shift) | (value >>> (32 - shift))) >>> 0\n\nconst getRoundValues = (index: number, state: Md5State): { f: number; g: number } => {\n const {\n b, c, d,\n } = state\n\n if (index < 16) return { f: (b & c) | (~b & d), g: index }\n if (index < 32) return { f: (d & b) | (~d & c), g: (5 * index + 1) % 16 }\n if (index < 48) return { f: b ^ c ^ d, g: (3 * index + 5) % 16 }\n return { f: c ^ (b | ~d), g: (7 * index) % 16 }\n}\n\nconst buildPaddedMessage = (value: string) => {\n const encoder = new TextEncoder()\n const message = encoder.encode(value)\n const bitLength = BigInt(message.length) * 8n\n const paddingLength = (56 - ((message.length + 1) % 64) + 64) % 64\n const bytes = new Uint8Array(message.length + 1 + paddingLength + 8)\n bytes.set(message)\n bytes[message.length] = 0x80\n\n const view = new DataView(bytes.buffer)\n view.setUint32(bytes.length - 8, Number(bitLength & 4_294_967_295n), true)\n view.setUint32(bytes.length - 4, Number((bitLength >> 32n) & 4_294_967_295n), true)\n return view\n}\n\nconst readWords = (view: DataView, offset: number) => {\n return Array.from({ length: 16 }, (_, index) => view.getUint32(offset + index * 4, true))\n}\n\nconst hashBlock = (view: DataView, offset: number, state: Md5State): Md5State => {\n const words = readWords(view, offset)\n const working = { ...state }\n\n for (let index = 0; index < 64; index++) {\n const { f, g } = getRoundValues(index, working)\n const previousD = working.d\n working.d = working.c\n working.c = working.b\n working.b = (working.b + leftRotate((working.a + f + constants[index] + words[g]) >>> 0, shiftAmounts[index])) >>> 0\n working.a = previousD\n }\n\n return {\n a: (state.a + working.a) >>> 0,\n b: (state.b + working.b) >>> 0,\n c: (state.c + working.c) >>> 0,\n d: (state.d + working.d) >>> 0,\n }\n}\n\nconst digestToRawString = ({\n a, b, c, d,\n}: Md5State) => {\n const bytes = new Uint8Array(16)\n const view = new DataView(bytes.buffer)\n for (const [index, word] of [a, b, c, d].entries()) {\n view.setUint32(index * 4, word, true)\n }\n return String.fromCodePoint(...bytes)\n}\n\n/** Returns SparkMD5-compatible raw MD5 output for a UTF-8 string. */\nexport const md5Raw = (value: string) => {\n const view = buildPaddedMessage(value)\n let state = initialState\n for (let offset = 0; offset < view.byteLength; offset += 64) {\n state = hashBlock(view, offset, state)\n }\n return digestToRawString(state)\n}\n", "/** Tracks and persists the document referrer in both session and local storage. */\nexport class Referrer {\n private static storageId = '_coin_referrer'\n local: string\n session: string\n constructor() {\n this.session = this.getFromSession() ?? document.referrer\n sessionStorage.setItem(Referrer.storageId, this.session)\n this.local = this.getFromLocal() ?? document.referrer\n globalThis.localStorage.setItem(Referrer.storageId, this.local)\n }\n\n /**\n * Returns the referrer data as a JSON object, or undefined if both values are empty.\n * @returns An object with local and session referrer strings, or undefined\n */\n toJson() {\n if ((this.local.length > 0) || (this.session.length > 0)) {\n return {\n local: this.local,\n session: this.session,\n }\n }\n }\n\n private getFromLocal() {\n const value = globalThis.localStorage.getItem(Referrer.storageId)\n if (value !== null && value.length > 0) {\n return value\n }\n }\n\n private getFromSession() {\n const value = sessionStorage.getItem(Referrer.storageId)\n if (value !== null && value.length > 0) {\n return value\n }\n }\n}\n", "/** Generates and persists a unique user identifier in localStorage. */\nexport class UniqueUserId {\n private static localStorageId = '_coin_cid'\n id: string\n\n constructor() {\n this.id = globalThis.localStorage.getItem(UniqueUserId.localStorageId) ?? this.generateId()\n globalThis.localStorage.setItem(UniqueUserId.localStorageId, this.id)\n }\n\n /** Returns the unique user ID as a string. */\n toString() {\n return this.id\n }\n\n private generateId() {\n return crypto.randomUUID()\n }\n}\n", "const isStringRecord = (value: unknown): value is Record<string, string> =>\n typeof value === 'object' && value !== null && Object.values(value).every(item => typeof item === 'string')\n\nconst isStringRecordArray = (value: unknown): value is Record<string, string>[] =>\n Array.isArray(value) && value.every(isStringRecord)\n\nconst recordsEqual = (left: Record<string, string> | undefined, right: Record<string, string>): boolean => {\n if (left === undefined) return false\n const leftEntries = Object.entries(left)\n if (leftEntries.length !== Object.keys(right).length) return false\n return leftEntries.every(([key, value]) => right[key] === value)\n}\n\n/** Tracks UTM campaign parameters from query strings, persisting history in localStorage. */\nexport class UtmFields {\n private static localStorageId = '_coin_utm'\n fields: Record<string, string>[] = []\n constructor() {\n const storedString = globalThis.localStorage.getItem(UtmFields.localStorageId) ?? '[]'\n try {\n const storedFields: unknown = JSON.parse(storedString)\n this.fields = isStringRecordArray(storedFields) ? storedFields : []\n } catch {\n this.fields = []\n }\n this.update()\n globalThis.localStorage.setItem(UtmFields.localStorageId, JSON.stringify(this.fields))\n }\n\n /**\n * Parses UTM parameters from the current URL query string.\n * @returns A record of UTM key-value pairs, or null if none are present\n */\n getUtmRecord = () => {\n const record: Record<string, string> = {}\n const parsedQueryString = document.location.search.split('?', 2)[1]?.split('&') ?? []\n for (const item of parsedQueryString) {\n const [fullKey, value] = item.split('=')\n const [keyCategory, keyName] = fullKey.split('_')\n if (keyCategory === 'utm') {\n record[keyName] = value\n }\n }\n return Object.keys(record).length > 0 ? record : null\n }\n\n /** Returns the UTM fields history as a JSON string. */\n toString() {\n return JSON.stringify(this.fields)\n }\n\n /**\n * Checks the query string for new UTM values and appends them to the history if changed.\n * @returns The current UTM fields array, or undefined if empty\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 && !recordsEqual(this.fields.at(-1), record)) {\n this.fields.push(record)\n }\n return this.fields ?? undefined\n }\n}\n", "import type { EmptyObject } from '@ariestools/sdk/object'\nimport type { Promisable } from '@ariestools/sdk/promise'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\n/** Abstract base class for handling user tracking events. */\nexport abstract class UserEventHandler<TData extends EmptyObject> {\n /** Tracks a funnel-started event. */\n abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promisable<void>\n /** Tracks a test-started event. */\n abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promisable<void>\n /** Tracks a user click event. */\n abstract userClick<T extends TData>(fields: T | UserClickFields): Promisable<void>\n /** Tracks a view-content event. */\n abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promisable<void>\n}\n", "import { type EmptyObject, toSafeJsonObject } from '@ariestools/sdk/object'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport { XyPixel } from './Pixel.ts'\nimport type { PurchaseFields } from './PurchaseFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport { UserEventHandler } from './UserEventHandler.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\n/** Concrete event handler that sends tracking events through the XyPixel singleton. */\nexport class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {\n constructor() {\n super()\n }\n\n /** Sends a funnel-started event via the pixel API. */\n async funnelStarted(fields: T | FunnelStartedFields) {\n return await XyPixel.instance.send('FunnelStarted', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a purchase event via the pixel API. */\n async purchase(fields: T | PurchaseFields) {\n return await XyPixel.instance.send('Purchase', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a test-started event via the pixel API. */\n async testStarted(fields: T | TestStartedFields) {\n return await XyPixel.instance.send('TestStarted', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a user click event via the pixel API. */\n async userClick(fields: T | UserClickFields) {\n return await XyPixel.instance.send('ViewPage', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a view-content event via the pixel API. */\n async viewContent(fields: T | ViewContentFields) {\n return await XyPixel.instance.send('ViewContent', toSafeJsonObject(fields, [], 10))\n }\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["import { fetchJsonPost } from '@ariestools/sdk/fetch'\nimport { isUndefined } from '@ariestools/sdk/typeof'\n\nimport type { UserEvent } from './UserEvent.ts'\n\nconst apiBaseUri: Record<string, string> = {\n beta: 'https://pixel.xylabs.com',\n local: 'http://localhost:3030',\n prod: 'https://pixel.xylabs.com',\n}\n\n/** HTTP client for sending tracking events to the XY Labs pixel API. */\nexport class PixelApi {\n private endPoint: string\n\n /* baseUri can either be a preset (prod, beta, local), or a specific URI */\n /** Resolves a named environment or uses the supplied endpoint URI directly. */\n constructor(baseUri = 'prod') {\n this.endPoint = isUndefined(apiBaseUri[baseUri]) ? baseUri : `${apiBaseUri[baseUri]}/t/event/queue`\n }\n\n /**\n * Sends an array of user events to the tracking API.\n * @param events - The events to submit\n * @returns The response data from the API\n */\n async trackEvents(events: UserEvent[]) {\n const response = await fetchJsonPost(this.endPoint, events)\n return response.data\n }\n}\n", "import { assertEx } from '@ariestools/sdk/assert'\nimport type { JsonObject } from '@ariestools/sdk/object'\nimport { Mutex } from 'async-mutex'\n\nimport type { UserEvent } from './Api/index.ts'\nimport { PixelApi } from './Api/index.ts'\nimport type { ExIds } from './ExIds.ts'\nimport { getSystemInfo } from './getSystemInfo.ts'\nimport { md5Raw } from './md5Raw.ts'\nimport { Referrer } from './Referrer.ts'\nimport { UniqueUserId } from './UniqueUserId.ts'\nimport { UtmFields } from './UtmFields.ts'\n\nconst emailHashLocalStorageName = 'xy_email_hash'\n\nconst getCookieValue = (name: string): string | undefined => {\n const encodedName = encodeURIComponent(name)\n const cookie = globalThis.document?.cookie\n if (cookie === undefined || cookie.length === 0) return undefined\n const cookies = cookie.split('; ')\n for (const item of cookies) {\n const separatorIndex = item.indexOf('=')\n const key = separatorIndex === -1 ? item : item.slice(0, separatorIndex)\n if (key === encodedName || key === name) {\n const value = separatorIndex === -1 ? '' : item.slice(separatorIndex + 1)\n return decodeURIComponent(value)\n }\n }\n}\n\n/** Singleton pixel tracker that queues and sends user events to the XY Labs tracking API. */\nexport class XyPixel {\n /** Shared transport used to flush queued events. */\n static api = new PixelApi()\n\n private static _instance?: XyPixel\n private static utmFieldsObj: UtmFields\n\n /** Persistent client identifier loaded from browser storage. */\n cid: string\n /** Raw email supplied through {@link identify}; not included by {@link send}. */\n email?: string\n /** MD5 email hash persisted for event correlation. */\n email_hash?: string | null\n /** External advertising and analytics identifiers refreshed before sending. */\n exids?: ExIds\n /** Pixel configuration identifier attached to emitted events. */\n pixelId?: string\n\n /** Events awaiting a successful API flush. */\n queue: UserEvent[] = []\n\n private queueMutex = new Mutex()\n\n private constructor(pixelId: string) {\n const uniqueUserId = new UniqueUserId()\n this.cid = uniqueUserId.id\n this.pixelId = pixelId\n this.email_hash = localStorage.getItem(emailHashLocalStorageName)\n }\n\n /** Returns the singleton XyPixel instance, throwing if not yet initialized. */\n static get instance(): XyPixel {\n return assertEx(this._instance, () => 'XyPixel uninitialized')\n }\n\n /**\n * Initializes the XyPixel singleton with the given pixel ID.\n * @param pixelId - The pixel identifier for this tracking instance\n * @returns The newly created XyPixel instance\n */\n static init(pixelId: string) {\n this._instance = new XyPixel(pixelId)\n return this._instance\n }\n\n /**\n * Replaces the default PixelApi instance used for sending events.\n */\n static selectApi(api: PixelApi) {\n this.api = api\n }\n\n private static utmFields = () => {\n this.utmFieldsObj ??= new UtmFields()\n return this.utmFieldsObj\n }\n\n /**\n * Associates an email address with this pixel instance, hashing it for privacy.\n * @param email - The email address to identify the user with\n */\n identify(email?: string) {\n this.email = email\n this.email_hash = (email !== undefined && email.length > 0) ? md5Raw(email) : undefined\n if (this.email_hash !== undefined) {\n localStorage.setItem(emailHashLocalStorageName, this.email_hash)\n }\n }\n\n /**\n * Queues a tracking event and attempts to flush the queue to the API.\n * @param event - The event name\n * @param fields - Optional event-specific fields\n * @param eventId - Optional unique event identifier\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 !== undefined) {\n const events = this.queue\n this.queue = []\n try {\n await api.trackEvents(events)\n } catch (ex) {\n if (events !== undefined) {\n // put it back since it failed\n this.queue = [...this.queue, ...events]\n }\n\n console.error(ex)\n }\n }\n })\n }\n\n private updateFbId() {\n this.exids = {\n fbc: getCookieValue('_fbc'),\n fbp: getCookieValue('_fbp'),\n ga: getCookieValue('_ga'),\n gclid: getCookieValue('_gcl_aw'),\n rdt_uid: getCookieValue('rdt_uid'),\n scid: getCookieValue('_scid'),\n tt_sessionId: sessionStorage.getItem('tt_sessionId') ?? undefined,\n }\n }\n}\n", "import type { UserEventSystem } from './Api/index.ts'\n\ninterface UserAgentBrand {\n brand: string\n version: string\n}\n\ninterface NavigatorUserAgentDataLike {\n brands?: UserAgentBrand[]\n mobile?: boolean\n platform?: string\n}\n\ntype NavigatorWithUserAgentData = Navigator & {\n userAgentData?: NavigatorUserAgentDataLike\n}\n\nconst cache: { systemInfo?: UserEventSystem } = {}\n\nconst firstMatch = (value: string, expressions: RegExp[]) => {\n for (const expression of expressions) {\n const match = expression.exec(value)\n if (match?.[1] !== undefined && match[1] !== '') return match[1].replaceAll('_', '.')\n }\n}\n\nconst browserFromUserAgentData = (userAgentData?: NavigatorUserAgentDataLike) => {\n const brands = userAgentData?.brands ?? []\n return brands.find(({ brand }) => !/not.?a.?brand/i.test(brand) && brand !== 'Chromium') ?? brands.find(({ brand }) => brand === 'Chromium')\n}\n\nconst parseBrowser = (userAgent: string, userAgentData?: NavigatorUserAgentDataLike): UserEventSystem['browser'] => {\n const brand = browserFromUserAgentData(userAgentData)\n if (brand !== undefined) return { name: brand.brand, version: brand.version }\n\n const browserParsers: [RegExp, string][] = [\n [/Edg\\/([\\d.]+)/, 'Microsoft Edge'],\n [/OPR\\/([\\d.]+)/, 'Opera'],\n [/Firefox\\/([\\d.]+)/, 'Firefox'],\n [/Chrome\\/([\\d.]+)/, 'Chrome'],\n [/Version\\/([\\d.]+).*Safari\\//, 'Safari'],\n ]\n\n for (const [expression, name] of browserParsers) {\n const version = firstMatch(userAgent, [expression])\n if (version !== undefined) return { name, version }\n }\n\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parseEngine = (userAgent: string): UserEventSystem['engine'] => {\n if (/Chrome\\/|Chromium\\/|Edg\\/|OPR\\//.test(userAgent)) {\n return { name: 'Blink' }\n }\n\n const webkitVersion = firstMatch(userAgent, [/AppleWebKit\\/([\\d.]+)/])\n if (webkitVersion !== undefined) return { name: 'WebKit', version: webkitVersion }\n\n const geckoVersion = firstMatch(userAgent, [/Gecko\\/([\\d.]+)/])\n if (geckoVersion !== undefined) return { name: 'Gecko', version: geckoVersion }\n\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parseOS = (userAgent: string, userAgentData?: NavigatorUserAgentDataLike): UserEventSystem['os'] => {\n const platform = userAgentData?.platform\n if (platform !== undefined && platform.length > 0) return { name: platform }\n\n const osParsers: [RegExp, string][] = [\n [/Windows NT ([\\d.]+)/, 'Windows'],\n [/Android ([\\d.]+)/, 'Android'],\n [/(?:iPhone|iPad|iPod).*OS ([\\d_]+)/, 'iOS'],\n [/Mac OS X ([\\d_]+)/, 'macOS'],\n ]\n\n for (const [expression, name] of osParsers) {\n const version = firstMatch(userAgent, [expression])\n if (version !== undefined) return { name, version }\n }\n\n if (userAgent.includes('Linux')) return { name: 'Linux' }\n return userAgent.length > 0 ? { name: 'Unknown' } : undefined\n}\n\nconst parsePlatform = (navigator: NavigatorWithUserAgentData, userAgent: string): UserEventSystem['platform'] => {\n const type = navigator.userAgentData?.mobile === true || /Android|Mobi|iPhone|iPad|iPod/i.test(userAgent) ? 'mobile' : 'desktop'\n const platform = navigator.userAgentData?.platform\n const vendor = navigator.vendor ?? ''\n\n return {\n type,\n vendor: vendor.length > 0 ? vendor : platform,\n }\n}\n\nconst parseSystemInfo = (): UserEventSystem | undefined => {\n const navigator = globalThis.navigator as NavigatorWithUserAgentData | undefined\n const userAgent = navigator?.userAgent ?? ''\n\n if (navigator === undefined || (userAgent.length === 0 && navigator.userAgentData === undefined)) return undefined\n\n return {\n browser: parseBrowser(userAgent, navigator.userAgentData),\n engine: parseEngine(userAgent),\n os: parseOS(userAgent, navigator.userAgentData),\n platform: parsePlatform(navigator, userAgent),\n }\n}\n\n/**\n * Returns parsed browser, OS, and engine information from the user agent string.\n * Results are cached after the first call.\n * @returns The parsed system info, or undefined if parsing fails\n */\nexport const getSystemInfo = () => {\n try {\n cache.systemInfo ??= parseSystemInfo()\n } catch (ex) {\n console.log(`getSystemInfo Error: ${ex instanceof Error ? ex.message : String(ex)}`)\n }\n return cache.systemInfo\n}\n", "interface Md5State {\n a: number\n b: number\n c: number\n d: number\n}\n\nconst shiftAmounts = [\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 7,\n 12,\n 17,\n 22,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 5,\n 9,\n 14,\n 20,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 4,\n 11,\n 16,\n 23,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n 6,\n 10,\n 15,\n 21,\n]\n\nconst constants = Array.from(\n { length: 64 },\n (_, index) => Math.trunc(Math.abs(Math.sin(index + 1)) * 4_294_967_296) >>> 0,\n)\n\nconst initialState: Md5State = {\n a: 1_732_584_193,\n b: 4_023_233_417,\n c: 2_562_383_102,\n d: 271_733_878,\n}\n\nconst leftRotate = (value: number, shift: number) => ((value << shift) | (value >>> (32 - shift))) >>> 0\n\nconst getRoundValues = (index: number, state: Md5State): { f: number; g: number } => {\n const {\n b, c, d,\n } = state\n\n if (index < 16) return { f: (b & c) | (~b & d), g: index }\n if (index < 32) return { f: (d & b) | (~d & c), g: (5 * index + 1) % 16 }\n if (index < 48) return { f: b ^ c ^ d, g: (3 * index + 5) % 16 }\n return { f: c ^ (b | ~d), g: (7 * index) % 16 }\n}\n\nconst buildPaddedMessage = (value: string) => {\n const encoder = new TextEncoder()\n const message = encoder.encode(value)\n const bitLength = BigInt(message.length) * 8n\n const paddingLength = (56 - ((message.length + 1) % 64) + 64) % 64\n const bytes = new Uint8Array(message.length + 1 + paddingLength + 8)\n bytes.set(message)\n bytes[message.length] = 0x80\n\n const view = new DataView(bytes.buffer)\n view.setUint32(bytes.length - 8, Number(bitLength & 4_294_967_295n), true)\n view.setUint32(bytes.length - 4, Number((bitLength >> 32n) & 4_294_967_295n), true)\n return view\n}\n\nconst readWords = (view: DataView, offset: number) => {\n return Array.from({ length: 16 }, (_, index) => view.getUint32(offset + index * 4, true))\n}\n\nconst hashBlock = (view: DataView, offset: number, state: Md5State): Md5State => {\n const words = readWords(view, offset)\n const working = { ...state }\n\n for (let index = 0; index < 64; index++) {\n const { f, g } = getRoundValues(index, working)\n const previousD = working.d\n working.d = working.c\n working.c = working.b\n working.b = (working.b + leftRotate((working.a + f + constants[index] + words[g]) >>> 0, shiftAmounts[index])) >>> 0\n working.a = previousD\n }\n\n return {\n a: (state.a + working.a) >>> 0,\n b: (state.b + working.b) >>> 0,\n c: (state.c + working.c) >>> 0,\n d: (state.d + working.d) >>> 0,\n }\n}\n\nconst digestToRawString = ({\n a, b, c, d,\n}: Md5State) => {\n const bytes = new Uint8Array(16)\n const view = new DataView(bytes.buffer)\n for (const [index, word] of [a, b, c, d].entries()) {\n view.setUint32(index * 4, word, true)\n }\n return String.fromCodePoint(...bytes)\n}\n\n/** Returns SparkMD5-compatible raw MD5 output for a UTF-8 string. */\nexport const md5Raw = (value: string) => {\n const view = buildPaddedMessage(value)\n let state = initialState\n for (let offset = 0; offset < view.byteLength; offset += 64) {\n state = hashBlock(view, offset, state)\n }\n return digestToRawString(state)\n}\n", "/** Tracks and persists the document referrer in both session and local storage. */\nexport class Referrer {\n private static storageId = '_coin_referrer'\n /** Referrer persisted across browser sessions. */\n local: string\n /** Referrer persisted for the current browser session. */\n session: string\n /** Loads stored referrers, falling back to `document.referrer`, then persists them. */\n constructor() {\n this.session = this.getFromSession() ?? document.referrer\n sessionStorage.setItem(Referrer.storageId, this.session)\n this.local = this.getFromLocal() ?? document.referrer\n globalThis.localStorage.setItem(Referrer.storageId, this.local)\n }\n\n /**\n * Returns the referrer data as a JSON object, or undefined if both values are empty.\n * @returns An object with local and session referrer strings, or undefined\n */\n toJson() {\n if ((this.local.length > 0) || (this.session.length > 0)) {\n return {\n local: this.local,\n session: this.session,\n }\n }\n }\n\n private getFromLocal() {\n const value = globalThis.localStorage.getItem(Referrer.storageId)\n if (value !== null && value.length > 0) {\n return value\n }\n }\n\n private getFromSession() {\n const value = sessionStorage.getItem(Referrer.storageId)\n if (value !== null && value.length > 0) {\n return value\n }\n }\n}\n", "/** Generates and persists a unique user identifier in localStorage. */\nexport class UniqueUserId {\n private static localStorageId = '_coin_cid'\n /** Persistent UUID associated with this browser profile. */\n id: string\n\n /** Loads the existing identifier or generates and persists a new UUID. */\n constructor() {\n this.id = globalThis.localStorage.getItem(UniqueUserId.localStorageId) ?? this.generateId()\n globalThis.localStorage.setItem(UniqueUserId.localStorageId, this.id)\n }\n\n /** Returns the unique user ID as a string. */\n toString() {\n return this.id\n }\n\n private generateId() {\n return crypto.randomUUID()\n }\n}\n", "const isStringRecord = (value: unknown): value is Record<string, string> =>\n typeof value === 'object' && value !== null && Object.values(value).every(item => typeof item === 'string')\n\nconst isStringRecordArray = (value: unknown): value is Record<string, string>[] =>\n Array.isArray(value) && value.every(isStringRecord)\n\nconst recordsEqual = (left: Record<string, string> | undefined, right: Record<string, string>): boolean => {\n if (left === undefined) return false\n const leftEntries = Object.entries(left)\n if (leftEntries.length !== Object.keys(right).length) return false\n return leftEntries.every(([key, value]) => right[key] === value)\n}\n\n/** Tracks UTM campaign parameters from query strings, persisting history in localStorage. */\nexport class UtmFields {\n private static localStorageId = '_coin_utm'\n /** Ordered history of distinct UTM parameter records. */\n fields: Record<string, string>[] = []\n /** Loads stored history, captures current URL parameters, and persists the result. */\n constructor() {\n const storedString = globalThis.localStorage.getItem(UtmFields.localStorageId) ?? '[]'\n try {\n const storedFields: unknown = JSON.parse(storedString)\n this.fields = isStringRecordArray(storedFields) ? storedFields : []\n } catch {\n this.fields = []\n }\n this.update()\n globalThis.localStorage.setItem(UtmFields.localStorageId, JSON.stringify(this.fields))\n }\n\n /**\n * Parses UTM parameters from the current URL query string.\n * @returns A record of UTM key-value pairs, or null if none are present\n */\n getUtmRecord = () => {\n const record: Record<string, string> = {}\n const parsedQueryString = document.location.search.split('?', 2)[1]?.split('&') ?? []\n for (const item of parsedQueryString) {\n const [fullKey, value] = item.split('=')\n const [keyCategory, keyName] = fullKey.split('_')\n if (keyCategory === 'utm') {\n record[keyName] = value\n }\n }\n return Object.keys(record).length > 0 ? record : null\n }\n\n /** Returns the UTM fields history as a JSON string. */\n toString() {\n return JSON.stringify(this.fields)\n }\n\n /**\n * Checks the query string for new UTM values and appends them to the history if changed.\n * @returns The current UTM fields array, or undefined if empty\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 && !recordsEqual(this.fields.at(-1), record)) {\n this.fields.push(record)\n }\n return this.fields ?? undefined\n }\n}\n", "import type { EmptyObject } from '@ariestools/sdk/object'\nimport type { Promisable } from '@ariestools/sdk/promise'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\n/** Abstract base class for handling user tracking events. */\nexport abstract class UserEventHandler<TData extends EmptyObject> {\n /** Tracks a funnel-started event. */\n abstract funnelStarted<T extends TData>(fields: T | FunnelStartedFields): Promisable<void>\n /** Tracks a test-started event. */\n abstract testStarted<T extends TData>(fields: T | TestStartedFields): Promisable<void>\n /** Tracks a user click event. */\n abstract userClick<T extends TData>(fields: T | UserClickFields): Promisable<void>\n /** Tracks a view-content event. */\n abstract viewContent<T extends TData>(fields: T | ViewContentFields): Promisable<void>\n}\n", "import { type EmptyObject, toSafeJsonObject } from '@ariestools/sdk/object'\n\nimport type { FunnelStartedFields } from './FunnelStartedFields.ts'\nimport { XyPixel } from './Pixel.ts'\nimport type { PurchaseFields } from './PurchaseFields.ts'\nimport type { TestStartedFields } from './TestStartedFields.ts'\nimport type { UserClickFields } from './UserClickFields.ts'\nimport { UserEventHandler } from './UserEventHandler.ts'\nimport type { ViewContentFields } from './ViewContentFields.ts'\n\n/** Concrete event handler that sends tracking events through the XyPixel singleton. */\nexport class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> {\n /** Creates a handler that delegates to the initialized pixel singleton. */\n constructor() {\n super()\n }\n\n /** Sends a funnel-started event via the pixel API. */\n async funnelStarted(fields: T | FunnelStartedFields) {\n return await XyPixel.instance.send('FunnelStarted', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a purchase event via the pixel API. */\n async purchase(fields: T | PurchaseFields) {\n return await XyPixel.instance.send('Purchase', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a test-started event via the pixel API. */\n async testStarted(fields: T | TestStartedFields) {\n return await XyPixel.instance.send('TestStarted', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a user click event via the pixel API. */\n async userClick(fields: T | UserClickFields) {\n return await XyPixel.instance.send('ViewPage', toSafeJsonObject(fields, [], 10))\n }\n\n /** Sends a view-content event via the pixel API. */\n async viewContent(fields: T | ViewContentFields) {\n return await XyPixel.instance.send('ViewContent', toSafeJsonObject(fields, [], 10))\n }\n}\n"], | ||
| "mappings": "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", | ||
| "names": [] | ||
| } |
@@ -7,10 +7,17 @@ import type { JsonObject } from '@ariestools/sdk/object'; | ||
| export declare class XyPixel { | ||
| /** Shared transport used to flush queued events. */ | ||
| static api: PixelApi; | ||
| private static _instance?; | ||
| private static utmFieldsObj; | ||
| /** Persistent client identifier loaded from browser storage. */ | ||
| cid: string; | ||
| /** Raw email supplied through {@link identify}; not included by {@link send}. */ | ||
| email?: string; | ||
| /** MD5 email hash persisted for event correlation. */ | ||
| email_hash?: string | null; | ||
| /** External advertising and analytics identifiers refreshed before sending. */ | ||
| exids?: ExIds; | ||
| /** Pixel configuration identifier attached to emitted events. */ | ||
| pixelId?: string; | ||
| /** Events awaiting a successful API flush. */ | ||
| queue: UserEvent[]; | ||
@@ -29,3 +36,2 @@ private queueMutex; | ||
| * Replaces the default PixelApi instance used for sending events. | ||
| * @param API - The PixelApi instance to use | ||
| */ | ||
@@ -32,0 +38,0 @@ static selectApi(api: PixelApi): void; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Pixel.d.ts","sourceRoot":"","sources":["../../src/Pixel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,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;AAwBvC,6FAA6F;AAC7F,qBAAa,OAAO;IAClB,MAAM,CAAC,GAAG,WAAiB;IAE3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAW;IAEtC,GAAG,EAAE,MAAM,CAAA;IACX,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;IAOP,+EAA+E;IAC/E,MAAM,KAAK,QAAQ,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;IAK3B;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ;IAI9B,OAAO,CAAC,MAAM,CAAC,SAAS,CAGvB;IAED;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;IAQvB;;;;;OAKG;IACG,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM;YAsB9D,aAAa;IAqB3B,OAAO,CAAC,UAAU;CAWnB"} | ||
| {"version":3,"file":"Pixel.d.ts","sourceRoot":"","sources":["../../src/Pixel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGxD,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;AAwBvC,6FAA6F;AAC7F,qBAAa,OAAO;IAClB,oDAAoD;IACpD,MAAM,CAAC,GAAG,WAAiB;IAE3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAS;IAClC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAW;IAEtC,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAA;IACX,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,8CAA8C;IAC9C,KAAK,EAAE,SAAS,EAAE,CAAK;IAEvB,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAOP,+EAA+E;IAC/E,MAAM,KAAK,QAAQ,IAAI,OAAO,CAE7B;IAED;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;IAK3B;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ;IAI9B,OAAO,CAAC,MAAM,CAAC,SAAS,CAGvB;IAED;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM;IAQvB;;;;;OAKG;IACG,IAAI,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM;YAsB9D,aAAa;IAqB3B,OAAO,CAAC,UAAU;CAWnB"} |
| import type { CommonFields } from './CommonFields.ts'; | ||
| /** Fields for a purchase tracking event. */ | ||
| export interface PurchaseFields extends CommonFields { | ||
| /** Order, product, or transaction identifier. */ | ||
| id: string; | ||
| /** Human-readable purchased item or order name. */ | ||
| name?: string; | ||
| /** Unit price associated with the purchase. */ | ||
| price?: number; | ||
| /** Total conversion value associated with the purchase. */ | ||
| value?: number; | ||
| } | ||
| //# sourceMappingURL=PurchaseFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"PurchaseFields.d.ts","sourceRoot":"","sources":["../../src/PurchaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,4CAA4C;AAC5C,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"} | ||
| {"version":3,"file":"PurchaseFields.d.ts","sourceRoot":"","sources":["../../src/PurchaseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,4CAA4C;AAC5C,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"} |
| /** Tracks and persists the document referrer in both session and local storage. */ | ||
| export declare class Referrer { | ||
| private static storageId; | ||
| /** Referrer persisted across browser sessions. */ | ||
| local: string; | ||
| /** Referrer persisted for the current browser session. */ | ||
| session: string; | ||
| /** Loads stored referrers, falling back to `document.referrer`, then persists them. */ | ||
| constructor(); | ||
@@ -7,0 +10,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Referrer.d.ts","sourceRoot":"","sources":["../../src/Referrer.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAmB;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;;IAQf;;;OAGG;IACH,MAAM;;;;IASN,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;CAMvB"} | ||
| {"version":3,"file":"Referrer.d.ts","sourceRoot":"","sources":["../../src/Referrer.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAmB;IAC3C,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAA;IACf,uFAAuF;;IAQvF;;;OAGG;IACH,MAAM;;;;IASN,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;CAMvB"} |
| import type { CommonFields } from './CommonFields.ts'; | ||
| /** Fields for a test-started tracking event (e.g. A/B test). */ | ||
| export interface TestStartedFields extends CommonFields { | ||
| /** Name of the experiment or test that started. */ | ||
| name: string; | ||
| } | ||
| //# sourceMappingURL=TestStartedFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"TestStartedFields.d.ts","sourceRoot":"","sources":["../../src/TestStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,gEAAgE;AAChE,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAA;CACb"} | ||
| {"version":3,"file":"TestStartedFields.d.ts","sourceRoot":"","sources":["../../src/TestStartedFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,gEAAgE;AAChE,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAA;CACb"} |
| /** Generates and persists a unique user identifier in localStorage. */ | ||
| export declare class UniqueUserId { | ||
| private static localStorageId; | ||
| /** Persistent UUID associated with this browser profile. */ | ||
| id: string; | ||
| /** Loads the existing identifier or generates and persists a new UUID. */ | ||
| constructor(); | ||
@@ -6,0 +8,0 @@ /** Returns the unique user ID as a string. */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"UniqueUserId.d.ts","sourceRoot":"","sources":["../../src/UniqueUserId.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,EAAE,EAAE,MAAM,CAAA;;IAOV,8CAA8C;IAC9C,QAAQ;IAIR,OAAO,CAAC,UAAU;CAGnB"} | ||
| {"version":3,"file":"UniqueUserId.d.ts","sourceRoot":"","sources":["../../src/UniqueUserId.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAA;IAEV,0EAA0E;;IAM1E,8CAA8C;IAC9C,QAAQ;IAIR,OAAO,CAAC,UAAU;CAGnB"} |
| import type { CommonFields } from './CommonFields.ts'; | ||
| /** Fields for a user click tracking event. */ | ||
| export interface UserClickFields extends CommonFields { | ||
| /** Human-readable name of the clicked element. */ | ||
| elementName: string; | ||
| /** Element category or HTML control type. */ | ||
| elementType: string; | ||
| /** User intent inferred from the click. */ | ||
| intent?: string; | ||
| /** Page or component placement of the clicked element. */ | ||
| placement?: string; | ||
| } | ||
| //# sourceMappingURL=UserClickFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"UserClickFields.d.ts","sourceRoot":"","sources":["../../src/UserClickFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,8CAA8C;AAC9C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"} | ||
| {"version":3,"file":"UserClickFields.d.ts","sourceRoot":"","sources":["../../src/UserClickFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,8CAA8C;AAC9C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAA;IACnB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"} |
| /** Tracks UTM campaign parameters from query strings, persisting history in localStorage. */ | ||
| export declare class UtmFields { | ||
| private static localStorageId; | ||
| /** Ordered history of distinct UTM parameter records. */ | ||
| fields: Record<string, string>[]; | ||
| /** Loads stored history, captures current URL parameters, and persists the result. */ | ||
| constructor(); | ||
@@ -6,0 +8,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"UtmFields.d.ts","sourceRoot":"","sources":["../../src/UtmFields.ts"],"names":[],"mappings":"AAaA,6FAA6F;AAC7F,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAK;;IAarC;;;OAGG;IACH,YAAY,sCAWX;IAED,uDAAuD;IACvD,QAAQ;IAIR;;;OAGG;IAEH,MAAM;CAOP"} | ||
| {"version":3,"file":"UtmFields.d.ts","sourceRoot":"","sources":["../../src/UtmFields.ts"],"names":[],"mappings":"AAaA,6FAA6F;AAC7F,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,cAAc,CAAc;IAC3C,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAK;IACrC,sFAAsF;;IAatF;;;OAGG;IACH,YAAY,sCAWX;IAED,uDAAuD;IACvD,QAAQ;IAIR;;;OAGG;IAEH,MAAM;CAOP"} |
| import type { CommonFields } from './CommonFields.ts'; | ||
| /** Fields for a view-content tracking event. */ | ||
| export interface ViewContentFields extends CommonFields { | ||
| /** Human-readable content name. */ | ||
| name: string; | ||
| /** Route or resource path of the viewed content. */ | ||
| path: string; | ||
| } | ||
| //# sourceMappingURL=ViewContentFields.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"ViewContentFields.d.ts","sourceRoot":"","sources":["../../src/ViewContentFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,gDAAgD;AAChD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb"} | ||
| {"version":3,"file":"ViewContentFields.d.ts","sourceRoot":"","sources":["../../src/ViewContentFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,gDAAgD;AAChD,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;CACb"} |
| /** JSON structure for an XY Labs tracking event as stored or transmitted. */ | ||
| export interface XyLabsTrackingEventJson { | ||
| /** Persistent client identifier. */ | ||
| cid: string; | ||
| /** Client-side creation timestamp in Unix milliseconds. */ | ||
| create_time?: number; | ||
| /** Raw email when intentionally included. */ | ||
| email?: string; | ||
| /** Hashed email used for pseudonymous matching. */ | ||
| email_hash?: string; | ||
| /** Event type or name. */ | ||
| event?: string; | ||
| /** Caller-provided event identifier. */ | ||
| event_id?: string; | ||
| /** External advertising and analytics identifiers. */ | ||
| exids?: Record<string, string>; | ||
| /** Event-specific attributes. */ | ||
| fields?: Record<string, unknown>; | ||
| /** Origin host recorded for the event. */ | ||
| host?: string; | ||
| /** Source IP recorded by the receiving system. */ | ||
| ip?: string; | ||
| /** Origin route or pathname. */ | ||
| pathname?: string; | ||
| /** Pixel configuration identifier. */ | ||
| pixel?: string; | ||
| /** Server-side receipt timestamp in Unix milliseconds. */ | ||
| receive_time?: number; | ||
| /** Request or persistence record identifier. */ | ||
| rid?: string; | ||
| /** Parsed client-system metadata. */ | ||
| system?: unknown; | ||
| /** Raw user-agent string. */ | ||
| ua?: string; | ||
| /** User identifier associated by the receiving system. */ | ||
| uid?: string; | ||
| /** Current or historical UTM campaign parameters. */ | ||
| utm?: Record<string, string>[] | Record<string, string[]>; | ||
| } | ||
| //# sourceMappingURL=XyLabsTrackingEventJson.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"XyLabsTrackingEventJson.d.ts","sourceRoot":"","sources":["../../src/XyLabsTrackingEventJson.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,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"} | ||
| {"version":3,"file":"XyLabsTrackingEventJson.d.ts","sourceRoot":"","sources":["../../src/XyLabsTrackingEventJson.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kDAAkD;IAClD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,6BAA6B;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,0DAA0D;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAC1D"} |
@@ -10,2 +10,3 @@ import { type EmptyObject } from '@ariestools/sdk/object'; | ||
| export declare class XyUserEventHandler<T extends EmptyObject = EmptyObject> extends UserEventHandler<T> { | ||
| /** Creates a handler that delegates to the initialized pixel singleton. */ | ||
| constructor(); | ||
@@ -12,0 +13,0 @@ /** Sends a funnel-started event via the pixel API. */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"XyUserEventHandler.d.ts","sourceRoot":"","sources":["../../src/XyUserEventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,wBAAwB,CAAA;AAE3E,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,uFAAuF;AACvF,qBAAa,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;;IAK9F,sDAAsD;IAChD,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB;IAInD,gDAAgD;IAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc;IAIzC,oDAAoD;IAC9C,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;IAI/C,kDAAkD;IAC5C,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,eAAe;IAI3C,oDAAoD;IAC9C,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;CAGhD"} | ||
| {"version":3,"file":"XyUserEventHandler.d.ts","sourceRoot":"","sources":["../../src/XyUserEventHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,wBAAwB,CAAA;AAE3E,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,uFAAuF;AACvF,qBAAa,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IAC9F,2EAA2E;;IAK3E,sDAAsD;IAChD,aAAa,CAAC,MAAM,EAAE,CAAC,GAAG,mBAAmB;IAInD,gDAAgD;IAC1C,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc;IAIzC,oDAAoD;IAC9C,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;IAI/C,kDAAkD;IAC5C,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,eAAe;IAI3C,oDAAoD;IAC9C,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,iBAAiB;CAGhD"} |
+2
-2
| { | ||
| "name": "@ariestools/pixel", | ||
| "version": "8.1.1", | ||
| "version": "8.1.2", | ||
| "description": "Event Client for xylabs ESB", | ||
@@ -45,3 +45,3 @@ "keywords": [ | ||
| "async-mutex": "~0.5.0", | ||
| "@ariestools/sdk": "~8.1.1" | ||
| "@ariestools/sdk": "~8.1.2" | ||
| }, | ||
@@ -48,0 +48,0 @@ "devDependencies": { |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
102939
8.83%923
12.7%1
-50%Updated