getu-attribution-v2-sdk 0.1.1 → 0.2.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.
@@ -274,10 +274,131 @@ export class AttributionStorageManager {
274
274
  constructor(logger) {
275
275
  this.UTM_STORAGE_KEY = "attribution_utm_data";
276
276
  this.SESSION_STORAGE_KEY = "attribution_session";
277
+ this.USER_ID_KEY = "getuai_user_id";
278
+ this.USER_ID_COOKIE_EXPIRES = 365; // days
277
279
  this.logger = logger;
278
280
  this.localStorage = new LocalStorageManager(logger);
279
281
  this.indexedDB = new IndexedDBManager(logger);
280
282
  }
283
+ // User ID management - stores in both cookie and localStorage
284
+ setUserId(userId) {
285
+ if (!userId || userId.trim() === "") {
286
+ this.logger.warn("Cannot set empty user ID");
287
+ return;
288
+ }
289
+ const trimmedUserId = userId.trim();
290
+ // Store in cookie
291
+ try {
292
+ this.setCookie(this.USER_ID_KEY, trimmedUserId, this.USER_ID_COOKIE_EXPIRES);
293
+ this.logger.debug(`👤 User ID stored in cookie: ${trimmedUserId}`);
294
+ }
295
+ catch (error) {
296
+ this.logger.error("Failed to store user ID in cookie:", error);
297
+ }
298
+ // Store in localStorage
299
+ try {
300
+ if (typeof localStorage !== "undefined") {
301
+ localStorage.setItem(this.USER_ID_KEY, trimmedUserId);
302
+ this.logger.debug(`👤 User ID stored in localStorage: ${trimmedUserId}`);
303
+ }
304
+ }
305
+ catch (error) {
306
+ this.logger.error("Failed to store user ID in localStorage:", error);
307
+ }
308
+ }
309
+ getUserId() {
310
+ // Try localStorage first
311
+ try {
312
+ if (typeof localStorage !== "undefined") {
313
+ const userId = localStorage.getItem(this.USER_ID_KEY);
314
+ if (userId) {
315
+ return userId;
316
+ }
317
+ }
318
+ }
319
+ catch (error) {
320
+ this.logger.debug("Failed to get user ID from localStorage:", error);
321
+ }
322
+ // Fallback to cookie
323
+ try {
324
+ const userId = this.getCookie(this.USER_ID_KEY);
325
+ if (userId) {
326
+ // Sync back to localStorage if cookie exists but localStorage doesn't
327
+ try {
328
+ if (typeof localStorage !== "undefined") {
329
+ localStorage.setItem(this.USER_ID_KEY, userId);
330
+ }
331
+ }
332
+ catch (error) {
333
+ // Ignore sync errors
334
+ }
335
+ return userId;
336
+ }
337
+ }
338
+ catch (error) {
339
+ this.logger.debug("Failed to get user ID from cookie:", error);
340
+ }
341
+ return null;
342
+ }
343
+ removeUserId() {
344
+ // Remove from cookie
345
+ try {
346
+ this.deleteCookie(this.USER_ID_KEY);
347
+ this.logger.debug("👤 User ID removed from cookie");
348
+ }
349
+ catch (error) {
350
+ this.logger.error("Failed to remove user ID from cookie:", error);
351
+ }
352
+ // Remove from localStorage
353
+ try {
354
+ if (typeof localStorage !== "undefined") {
355
+ localStorage.removeItem(this.USER_ID_KEY);
356
+ this.logger.debug("👤 User ID removed from localStorage");
357
+ }
358
+ }
359
+ catch (error) {
360
+ this.logger.error("Failed to remove user ID from localStorage:", error);
361
+ }
362
+ }
363
+ // Cookie helper methods
364
+ setCookie(name, value, days) {
365
+ try {
366
+ const expires = new Date();
367
+ expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);
368
+ const cookieValue = `${name}=${encodeURIComponent(value)};expires=${expires.toUTCString()};path=/;SameSite=Lax`;
369
+ document.cookie = cookieValue;
370
+ }
371
+ catch (error) {
372
+ this.logger.error("Failed to set cookie:", error);
373
+ }
374
+ }
375
+ getCookie(name) {
376
+ try {
377
+ const nameEQ = name + "=";
378
+ const ca = document.cookie.split(";");
379
+ for (let i = 0; i < ca.length; i++) {
380
+ let c = ca[i];
381
+ while (c.charAt(0) === " ")
382
+ c = c.substring(1, c.length);
383
+ if (c.indexOf(nameEQ) === 0) {
384
+ return decodeURIComponent(c.substring(nameEQ.length, c.length));
385
+ }
386
+ }
387
+ return null;
388
+ }
389
+ catch (error) {
390
+ this.logger.error("Failed to get cookie:", error);
391
+ return null;
392
+ }
393
+ }
394
+ deleteCookie(name) {
395
+ try {
396
+ document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;
397
+ }
398
+ catch (error) {
399
+ this.logger.error("Failed to delete cookie:", error);
400
+ }
401
+ }
281
402
  async init() {
282
403
  await this.indexedDB.init();
283
404
  }
@@ -1,5 +1,6 @@
1
1
  export declare enum EventType {
2
2
  PAGE_VIEW = "page_view",
3
+ PAGE_CLICK = "page_click",// User click journey tracking
3
4
  VIDEO_PLAY = "video_play",
4
5
  FORM_SUBMIT = "form_submit",
5
6
  EMAIL_VERIFICATION = "email_verification",
@@ -54,6 +55,7 @@ export interface EventData {
54
55
  }
55
56
  export interface BatchEventRequest {
56
57
  events: EventData[];
58
+ sdk_version: string;
57
59
  }
58
60
  export declare const defaultEndpoint = "https://attribution.getu.ai/attribution/api";
59
61
  export interface SDKConfig {
@@ -72,6 +74,7 @@ export interface SDKConfig {
72
74
  excludeDomains?: string[];
73
75
  autoCleanUTM?: boolean;
74
76
  pageViewDebounceInterval?: number;
77
+ userId?: string;
75
78
  }
76
79
  export interface StorageInterface {
77
80
  get(key: string): any;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,oBAAY,SAAS;IAEnB,SAAS,cAAc;IACvB,UAAU,eAAe,CAAE,8BAA8B;IACzD,UAAU,eAAe;IAGzB,WAAW,gBAAgB;IAC3B,kBAAkB,uBAAuB;IAGzC,KAAK,UAAU;IAGf,MAAM,WAAW;IAGjB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;CACtB;AAGD,oBAAY,QAAQ;IAClB,GAAG,QAAQ;CACZ;AAGD,MAAM,WAAW,OAAO;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,SAAS,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAExC,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE;YACL,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACzB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;SAC9C,CAAC;QACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,eAAO,MAAM,eAAe,gDAAgD,CAAC;AAE7E,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAElC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC;IACnC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf;AAGD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CAC9C;AAGD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,eAAO,MAAM,gBAAgB,aAM5B,CAAC"}
@@ -3,6 +3,7 @@ export var EventType;
3
3
  (function (EventType) {
4
4
  // Pre-conversion signals
5
5
  EventType["PAGE_VIEW"] = "page_view";
6
+ EventType["PAGE_CLICK"] = "page_click";
6
7
  EventType["VIDEO_PLAY"] = "video_play";
7
8
  // Registration funnel
8
9
  EventType["FORM_SUBMIT"] = "form_submit";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SDK Version
3
+ * This version should match the version in package.json
4
+ */
5
+ export declare const SDK_VERSION = "2.0.0";
6
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,WAAW,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * SDK Version
3
+ * This version should match the version in package.json
4
+ */
5
+ export const SDK_VERSION = "2.0.0";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "getu-attribution-v2-sdk",
3
- "version": "0.1.1",
4
- "description": "GetuAI Attribution SDK for client-side tracking",
3
+ "version": "0.2.2",
4
+ "description": "GetuAI Attribution V2 SDK for client-side tracking",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
7
7
  "browser": "dist/getuai-attribution.min.js",
@@ -25,7 +25,8 @@
25
25
  "test": "jest",
26
26
  "lint": "eslint src/**/*.ts",
27
27
  "clean": "rimraf dist",
28
- "prepublishOnly": "npm run build"
28
+ "prepublishOnly": "npm run build",
29
+ "serve": "python -m http.server 8080"
29
30
  },
30
31
  "keywords": [
31
32
  "attribution",