@shware/analytics 0.1.15 → 0.1.16

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 (53) hide show
  1. package/dist/index.cjs +17 -182
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +7 -501
  4. package/dist/index.d.ts +7 -501
  5. package/dist/index.mjs +5 -158
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/next/index.cjs +3 -3
  8. package/dist/next/index.cjs.map +1 -1
  9. package/dist/next/index.mjs +1 -1
  10. package/dist/next/index.mjs.map +1 -1
  11. package/dist/react-router/index.cjs +3 -3
  12. package/dist/react-router/index.cjs.map +1 -1
  13. package/dist/react-router/index.mjs +1 -1
  14. package/dist/react-router/index.mjs.map +1 -1
  15. package/dist/schema/index.cjs +85 -0
  16. package/dist/schema/index.cjs.map +1 -0
  17. package/dist/schema/index.d.cts +177 -0
  18. package/dist/schema/index.d.ts +177 -0
  19. package/dist/schema/index.mjs +58 -0
  20. package/dist/schema/index.mjs.map +1 -0
  21. package/dist/setup/index.cjs +63 -0
  22. package/dist/setup/index.cjs.map +1 -0
  23. package/dist/setup/index.d.cts +29 -0
  24. package/dist/setup/index.d.ts +29 -0
  25. package/dist/setup/index.mjs +27 -0
  26. package/dist/setup/index.mjs.map +1 -0
  27. package/dist/track/ga.cjs +102 -0
  28. package/dist/track/ga.cjs.map +1 -0
  29. package/dist/track/ga.d.cts +4 -0
  30. package/dist/track/ga.d.ts +4 -0
  31. package/dist/track/ga.mjs +76 -0
  32. package/dist/track/ga.mjs.map +1 -0
  33. package/dist/track/index.cjs +65 -0
  34. package/dist/track/index.cjs.map +1 -0
  35. package/dist/track/index.d.cts +10 -0
  36. package/dist/track/index.d.ts +10 -0
  37. package/dist/track/index.mjs +40 -0
  38. package/dist/track/index.mjs.map +1 -0
  39. package/dist/types/index.cjs +19 -0
  40. package/dist/types/index.cjs.map +1 -0
  41. package/dist/types/index.d.cts +327 -0
  42. package/dist/types/index.d.ts +327 -0
  43. package/dist/types/index.mjs +1 -0
  44. package/dist/types/index.mjs.map +1 -0
  45. package/dist/visitor/index.cjs +77 -0
  46. package/dist/visitor/index.cjs.map +1 -0
  47. package/dist/visitor/index.d.cts +6 -0
  48. package/dist/visitor/index.d.ts +6 -0
  49. package/dist/visitor/index.mjs +51 -0
  50. package/dist/visitor/index.mjs.map +1 -0
  51. package/dist/web/index.d.cts +1 -50
  52. package/dist/web/index.d.ts +1 -50
  53. package/package.json +1 -1
@@ -0,0 +1,58 @@
1
+ // src/schema/index.ts
2
+ import { z } from "zod";
3
+ var createTrackEventSchema = z.object({
4
+ name: z.string().trim().min(1).max(64),
5
+ visitor_id: z.coerce.bigint(),
6
+ tags: z.object({
7
+ os: z.string().optional(),
8
+ os_name: z.string().optional(),
9
+ os_version: z.string().optional(),
10
+ browser: z.string().optional(),
11
+ browser_name: z.string().optional(),
12
+ browser_version: z.string().optional(),
13
+ platform: z.enum(["ios", "android", "web", "macos", "windows", "linux", "unknown"]).optional(),
14
+ device: z.string().optional(),
15
+ device_id: z.string().trim().min(1).max(36).optional(),
16
+ device_type: z.string().optional(),
17
+ device_vendor: z.string().optional(),
18
+ device_pixel_ratio: z.string().optional(),
19
+ screen_resolution: z.string().regex(/^\d+x\d+$/).transform((v) => v).optional(),
20
+ release: z.string().optional(),
21
+ language: z.string().optional(),
22
+ timezone: z.string().optional(),
23
+ environment: z.enum(["development", "production"]).optional(),
24
+ source_url: z.string().optional(),
25
+ source: z.enum(["web", "app", "offline"]).optional(),
26
+ fbc: z.string().optional(),
27
+ fbp: z.string().optional(),
28
+ gclid: z.string().optional(),
29
+ utm_source: z.string().optional(),
30
+ utm_medium: z.string().optional(),
31
+ utm_campaign: z.string().optional(),
32
+ utm_term: z.string().optional(),
33
+ utm_content: z.string().optional()
34
+ }),
35
+ properties: z.record(
36
+ z.string().trim().min(1).max(128),
37
+ z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
38
+ ).refine((data) => Object.keys(data).length <= 64)
39
+ });
40
+ var createVisitorSchema = z.object({
41
+ device_id: z.string().trim().min(1).max(36),
42
+ properties: z.record(
43
+ z.string().trim().min(1).max(128),
44
+ z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
45
+ ).refine((data) => Object.keys(data).length <= 64)
46
+ });
47
+ var updateVisitorSchema = z.object({
48
+ properties: z.record(
49
+ z.string().trim().min(1).max(128),
50
+ z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
51
+ ).refine((data) => Object.keys(data).length <= 64)
52
+ });
53
+ export {
54
+ createTrackEventSchema,
55
+ createVisitorSchema,
56
+ updateVisitorSchema
57
+ };
58
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const createTrackEventSchema = z.object({\n name: z.string().trim().min(1).max(64),\n visitor_id: z.coerce.bigint(),\n tags: z.object({\n os: z.string().optional(),\n os_name: z.string().optional(),\n os_version: z.string().optional(),\n browser: z.string().optional(),\n browser_name: z.string().optional(),\n browser_version: z.string().optional(),\n platform: z.enum(['ios', 'android', 'web', 'macos', 'windows', 'linux', 'unknown']).optional(),\n device: z.string().optional(),\n device_id: z.string().trim().min(1).max(36).optional(),\n device_type: z.string().optional(),\n device_vendor: z.string().optional(),\n device_pixel_ratio: z.string().optional(),\n screen_resolution: z\n .string()\n .regex(/^\\d+x\\d+$/)\n .transform((v) => v as `${number}x${number}`)\n .optional(),\n release: z.string().optional(),\n language: z.string().optional(),\n timezone: z.string().optional(),\n environment: z.enum(['development', 'production']).optional(),\n source_url: z.string().optional(),\n source: z.enum(['web', 'app', 'offline']).optional(),\n fbc: z.string().optional(),\n fbp: z.string().optional(),\n gclid: z.string().optional(),\n utm_source: z.string().optional(),\n utm_medium: z.string().optional(),\n utm_campaign: z.string().optional(),\n utm_term: z.string().optional(),\n utm_content: z.string().optional(),\n }),\n properties: z\n .record(\n z.string().trim().min(1).max(128),\n z.union([z.string().max(512), z.number(), z.boolean(), z.null()])\n )\n .refine((data) => Object.keys(data).length <= 64),\n});\n\nexport const createVisitorSchema = z.object({\n device_id: z.string().trim().min(1).max(36),\n properties: z\n .record(\n z.string().trim().min(1).max(128),\n z.union([z.string().max(512), z.number(), z.boolean(), z.null()])\n )\n .refine((data) => Object.keys(data).length <= 64),\n});\n\nexport const updateVisitorSchema = z.object({\n properties: z\n .record(\n z.string().trim().min(1).max(128),\n z.union([z.string().max(512), z.number(), z.boolean(), z.null()])\n )\n .refine((data) => Object.keys(data).length <= 64),\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/setup/index.ts
31
+ var setup_exports = {};
32
+ __export(setup_exports, {
33
+ config: () => config,
34
+ setupAnalytics: () => setupAnalytics
35
+ });
36
+ module.exports = __toCommonJS(setup_exports);
37
+ var import_axios = __toESM(require("axios"), 1);
38
+ var import_axios_retry = __toESM(require("axios-retry"), 1);
39
+ var config = {
40
+ http: null,
41
+ release: "0.0.0",
42
+ storage: null,
43
+ getTags: null,
44
+ getDeviceId: null,
45
+ thirdPartyTrackers: [],
46
+ thirdPartyUserSetters: []
47
+ };
48
+ function setupAnalytics(init) {
49
+ config.release = init.release;
50
+ config.storage = init.storage;
51
+ config.getTags = init.getTags;
52
+ config.getDeviceId = init.getDeviceId;
53
+ config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];
54
+ config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];
55
+ config.http = import_axios.default.create({ baseURL: init.endpoint, withCredentials: true, adapter: "fetch" });
56
+ (0, import_axios_retry.default)(config.http, { retries: 5, retryDelay: import_axios_retry.default.exponentialDelay });
57
+ }
58
+ // Annotate the CommonJS export names for ESM import in node:
59
+ 0 && (module.exports = {
60
+ config,
61
+ setupAnalytics
62
+ });
63
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport retry from 'axios-retry';\nimport { ThirdPartyTracker, ThirdPartyUserSetter, TrackTags } from '../types/index';\n\nexport interface Storage {\n getItem: (key: string) => (string | null) | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n storage: Storage;\n http: AxiosInstance;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\nexport const config: Config = {\n http: null!,\n release: '0.0.0',\n storage: null!,\n getTags: null!,\n getDeviceId: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n config.http = axios.create({ baseURL: init.endpoint, withCredentials: true, adapter: 'fetch' });\n retry(config.http, { retries: 5, retryDelay: retry.exponentialDelay });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAqC;AACrC,yBAAkB;AA4BX,IAAM,SAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAC9D,SAAO,OAAO,aAAAA,QAAM,OAAO,EAAE,SAAS,KAAK,UAAU,iBAAiB,MAAM,SAAS,QAAQ,CAAC;AAC9F,yBAAAC,SAAM,OAAO,MAAM,EAAE,SAAS,GAAG,YAAY,mBAAAA,QAAM,iBAAiB,CAAC;AACvE;","names":["axios","retry"]}
@@ -0,0 +1,29 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { TrackTags, ThirdPartyTracker, ThirdPartyUserSetter } from '../types/index.cjs';
3
+
4
+ interface Storage {
5
+ getItem: (key: string) => (string | null) | Promise<string | null>;
6
+ setItem: (key: string, value: string) => void | Promise<void>;
7
+ }
8
+ interface Options {
9
+ release: string;
10
+ storage: Storage;
11
+ endpoint: string;
12
+ getTags: () => TrackTags | Promise<TrackTags>;
13
+ getDeviceId: () => string | Promise<string>;
14
+ thirdPartyTrackers?: ThirdPartyTracker[];
15
+ thirdPartyUserSetters?: ThirdPartyUserSetter[];
16
+ }
17
+ interface Config {
18
+ release: string;
19
+ storage: Storage;
20
+ http: AxiosInstance;
21
+ getTags: () => TrackTags | Promise<TrackTags>;
22
+ getDeviceId: () => string | Promise<string>;
23
+ thirdPartyTrackers: ThirdPartyTracker[];
24
+ thirdPartyUserSetters: ThirdPartyUserSetter[];
25
+ }
26
+ declare const config: Config;
27
+ declare function setupAnalytics(init: Options): void;
28
+
29
+ export { type Options, type Storage, config, setupAnalytics };
@@ -0,0 +1,29 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { TrackTags, ThirdPartyTracker, ThirdPartyUserSetter } from '../types/index.js';
3
+
4
+ interface Storage {
5
+ getItem: (key: string) => (string | null) | Promise<string | null>;
6
+ setItem: (key: string, value: string) => void | Promise<void>;
7
+ }
8
+ interface Options {
9
+ release: string;
10
+ storage: Storage;
11
+ endpoint: string;
12
+ getTags: () => TrackTags | Promise<TrackTags>;
13
+ getDeviceId: () => string | Promise<string>;
14
+ thirdPartyTrackers?: ThirdPartyTracker[];
15
+ thirdPartyUserSetters?: ThirdPartyUserSetter[];
16
+ }
17
+ interface Config {
18
+ release: string;
19
+ storage: Storage;
20
+ http: AxiosInstance;
21
+ getTags: () => TrackTags | Promise<TrackTags>;
22
+ getDeviceId: () => string | Promise<string>;
23
+ thirdPartyTrackers: ThirdPartyTracker[];
24
+ thirdPartyUserSetters: ThirdPartyUserSetter[];
25
+ }
26
+ declare const config: Config;
27
+ declare function setupAnalytics(init: Options): void;
28
+
29
+ export { type Options, type Storage, config, setupAnalytics };
@@ -0,0 +1,27 @@
1
+ // src/setup/index.ts
2
+ import axios from "axios";
3
+ import retry from "axios-retry";
4
+ var config = {
5
+ http: null,
6
+ release: "0.0.0",
7
+ storage: null,
8
+ getTags: null,
9
+ getDeviceId: null,
10
+ thirdPartyTrackers: [],
11
+ thirdPartyUserSetters: []
12
+ };
13
+ function setupAnalytics(init) {
14
+ config.release = init.release;
15
+ config.storage = init.storage;
16
+ config.getTags = init.getTags;
17
+ config.getDeviceId = init.getDeviceId;
18
+ config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];
19
+ config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];
20
+ config.http = axios.create({ baseURL: init.endpoint, withCredentials: true, adapter: "fetch" });
21
+ retry(config.http, { retries: 5, retryDelay: retry.exponentialDelay });
22
+ }
23
+ export {
24
+ config,
25
+ setupAnalytics
26
+ };
27
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport retry from 'axios-retry';\nimport { ThirdPartyTracker, ThirdPartyUserSetter, TrackTags } from '../types/index';\n\nexport interface Storage {\n getItem: (key: string) => (string | null) | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n storage: Storage;\n http: AxiosInstance;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\nexport const config: Config = {\n http: null!,\n release: '0.0.0',\n storage: null!,\n getTags: null!,\n getDeviceId: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n config.http = axios.create({ baseURL: init.endpoint, withCredentials: true, adapter: 'fetch' });\n retry(config.http, { retries: 5, retryDelay: retry.exponentialDelay });\n}\n"],"mappings":";AAAA,OAAO,WAA8B;AACrC,OAAO,WAAW;AA4BX,IAAM,SAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAC9D,SAAO,OAAO,MAAM,OAAO,EAAE,SAAS,KAAK,UAAU,iBAAiB,MAAM,SAAS,QAAQ,CAAC;AAC9F,QAAM,OAAO,MAAM,EAAE,SAAS,GAAG,YAAY,MAAM,iBAAiB,CAAC;AACvE;","names":[]}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/track/ga.ts
21
+ var ga_exports = {};
22
+ __export(ga_exports, {
23
+ reservedEventNames: () => reservedEventNames,
24
+ standardEventNames: () => standardEventNames
25
+ });
26
+ module.exports = __toCommonJS(ga_exports);
27
+ var standardEventNames = [
28
+ "add_payment_info",
29
+ "add_shipping_info",
30
+ "add_to_cart",
31
+ "add_to_wishlist",
32
+ "begin_checkout",
33
+ "close_convert_lead",
34
+ "close_unconvert_lead",
35
+ "disqualify_lead",
36
+ "earn_virtual_currency",
37
+ "generate_lead",
38
+ "join_group",
39
+ "level_end",
40
+ "level_start",
41
+ "level_up",
42
+ "login",
43
+ "post_score",
44
+ "purchase",
45
+ "qualify_lead",
46
+ "refund",
47
+ "remove_from_cart",
48
+ "search",
49
+ "select_content",
50
+ "select_item",
51
+ "select_promotion",
52
+ "share",
53
+ "sign_up",
54
+ "spend_virtual_currency",
55
+ "tutorial_begin",
56
+ "tutorial_complete",
57
+ "unlock_achievement",
58
+ "view_cart",
59
+ "view_item",
60
+ "view_item_list",
61
+ "view_promotion",
62
+ "working_lead"
63
+ ];
64
+ var reservedEventNames = [
65
+ "ad_activeview",
66
+ "ad_click",
67
+ "ad_exposure",
68
+ "ad_query",
69
+ "ad_reward",
70
+ "adunit_exposure",
71
+ "app_background",
72
+ "app_clear_data",
73
+ "app_exception",
74
+ "app_remove",
75
+ "app_store_refund",
76
+ "app_store_subscription_cancel",
77
+ "app_store_subscription_convert",
78
+ "app_store_subscription_renew",
79
+ "app_update",
80
+ "app_upgrade",
81
+ "dynamic_link_app_open",
82
+ "dynamic_link_app_update",
83
+ "dynamic_link_first_open",
84
+ "error",
85
+ "first_open",
86
+ "first_visit",
87
+ "in_app_purchase",
88
+ "notification_dismiss",
89
+ "notification_foreground",
90
+ "notification_open",
91
+ "notification_receive",
92
+ "os_update",
93
+ "session_start",
94
+ "session_start_with_rollout",
95
+ "user_engagement"
96
+ ];
97
+ // Annotate the CommonJS export names for ESM import in node:
98
+ 0 && (module.exports = {
99
+ reservedEventNames,
100
+ standardEventNames
101
+ });
102
+ //# sourceMappingURL=ga.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/ga.ts"],"sourcesContent":["export const standardEventNames = [\n 'add_payment_info',\n 'add_shipping_info',\n 'add_to_cart',\n 'add_to_wishlist',\n 'begin_checkout',\n 'close_convert_lead',\n 'close_unconvert_lead',\n 'disqualify_lead',\n 'earn_virtual_currency',\n 'generate_lead',\n 'join_group',\n 'level_end',\n 'level_start',\n 'level_up',\n 'login',\n 'post_score',\n 'purchase',\n 'qualify_lead',\n 'refund',\n 'remove_from_cart',\n 'search',\n 'select_content',\n 'select_item',\n 'select_promotion',\n 'share',\n 'sign_up',\n 'spend_virtual_currency',\n 'tutorial_begin',\n 'tutorial_complete',\n 'unlock_achievement',\n 'view_cart',\n 'view_item',\n 'view_item_list',\n 'view_promotion',\n 'working_lead',\n] as const;\n\nexport const reservedEventNames = [\n 'ad_activeview',\n 'ad_click',\n 'ad_exposure',\n 'ad_query',\n 'ad_reward',\n 'adunit_exposure',\n 'app_background',\n 'app_clear_data',\n 'app_exception',\n 'app_remove',\n 'app_store_refund',\n 'app_store_subscription_cancel',\n 'app_store_subscription_convert',\n 'app_store_subscription_renew',\n 'app_update',\n 'app_upgrade',\n 'dynamic_link_app_open',\n 'dynamic_link_app_update',\n 'dynamic_link_first_open',\n 'error',\n 'first_open',\n 'first_visit',\n 'in_app_purchase',\n 'notification_dismiss',\n 'notification_foreground',\n 'notification_open',\n 'notification_receive',\n 'os_update',\n 'session_start',\n 'session_start_with_rollout',\n 'user_engagement',\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ declare const standardEventNames: readonly ["add_payment_info", "add_shipping_info", "add_to_cart", "add_to_wishlist", "begin_checkout", "close_convert_lead", "close_unconvert_lead", "disqualify_lead", "earn_virtual_currency", "generate_lead", "join_group", "level_end", "level_start", "level_up", "login", "post_score", "purchase", "qualify_lead", "refund", "remove_from_cart", "search", "select_content", "select_item", "select_promotion", "share", "sign_up", "spend_virtual_currency", "tutorial_begin", "tutorial_complete", "unlock_achievement", "view_cart", "view_item", "view_item_list", "view_promotion", "working_lead"];
2
+ declare const reservedEventNames: string[];
3
+
4
+ export { reservedEventNames, standardEventNames };
@@ -0,0 +1,4 @@
1
+ declare const standardEventNames: readonly ["add_payment_info", "add_shipping_info", "add_to_cart", "add_to_wishlist", "begin_checkout", "close_convert_lead", "close_unconvert_lead", "disqualify_lead", "earn_virtual_currency", "generate_lead", "join_group", "level_end", "level_start", "level_up", "login", "post_score", "purchase", "qualify_lead", "refund", "remove_from_cart", "search", "select_content", "select_item", "select_promotion", "share", "sign_up", "spend_virtual_currency", "tutorial_begin", "tutorial_complete", "unlock_achievement", "view_cart", "view_item", "view_item_list", "view_promotion", "working_lead"];
2
+ declare const reservedEventNames: string[];
3
+
4
+ export { reservedEventNames, standardEventNames };
@@ -0,0 +1,76 @@
1
+ // src/track/ga.ts
2
+ var standardEventNames = [
3
+ "add_payment_info",
4
+ "add_shipping_info",
5
+ "add_to_cart",
6
+ "add_to_wishlist",
7
+ "begin_checkout",
8
+ "close_convert_lead",
9
+ "close_unconvert_lead",
10
+ "disqualify_lead",
11
+ "earn_virtual_currency",
12
+ "generate_lead",
13
+ "join_group",
14
+ "level_end",
15
+ "level_start",
16
+ "level_up",
17
+ "login",
18
+ "post_score",
19
+ "purchase",
20
+ "qualify_lead",
21
+ "refund",
22
+ "remove_from_cart",
23
+ "search",
24
+ "select_content",
25
+ "select_item",
26
+ "select_promotion",
27
+ "share",
28
+ "sign_up",
29
+ "spend_virtual_currency",
30
+ "tutorial_begin",
31
+ "tutorial_complete",
32
+ "unlock_achievement",
33
+ "view_cart",
34
+ "view_item",
35
+ "view_item_list",
36
+ "view_promotion",
37
+ "working_lead"
38
+ ];
39
+ var reservedEventNames = [
40
+ "ad_activeview",
41
+ "ad_click",
42
+ "ad_exposure",
43
+ "ad_query",
44
+ "ad_reward",
45
+ "adunit_exposure",
46
+ "app_background",
47
+ "app_clear_data",
48
+ "app_exception",
49
+ "app_remove",
50
+ "app_store_refund",
51
+ "app_store_subscription_cancel",
52
+ "app_store_subscription_convert",
53
+ "app_store_subscription_renew",
54
+ "app_update",
55
+ "app_upgrade",
56
+ "dynamic_link_app_open",
57
+ "dynamic_link_app_update",
58
+ "dynamic_link_first_open",
59
+ "error",
60
+ "first_open",
61
+ "first_visit",
62
+ "in_app_purchase",
63
+ "notification_dismiss",
64
+ "notification_foreground",
65
+ "notification_open",
66
+ "notification_receive",
67
+ "os_update",
68
+ "session_start",
69
+ "session_start_with_rollout",
70
+ "user_engagement"
71
+ ];
72
+ export {
73
+ reservedEventNames,
74
+ standardEventNames
75
+ };
76
+ //# sourceMappingURL=ga.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/ga.ts"],"sourcesContent":["export const standardEventNames = [\n 'add_payment_info',\n 'add_shipping_info',\n 'add_to_cart',\n 'add_to_wishlist',\n 'begin_checkout',\n 'close_convert_lead',\n 'close_unconvert_lead',\n 'disqualify_lead',\n 'earn_virtual_currency',\n 'generate_lead',\n 'join_group',\n 'level_end',\n 'level_start',\n 'level_up',\n 'login',\n 'post_score',\n 'purchase',\n 'qualify_lead',\n 'refund',\n 'remove_from_cart',\n 'search',\n 'select_content',\n 'select_item',\n 'select_promotion',\n 'share',\n 'sign_up',\n 'spend_virtual_currency',\n 'tutorial_begin',\n 'tutorial_complete',\n 'unlock_achievement',\n 'view_cart',\n 'view_item',\n 'view_item_list',\n 'view_promotion',\n 'working_lead',\n] as const;\n\nexport const reservedEventNames = [\n 'ad_activeview',\n 'ad_click',\n 'ad_exposure',\n 'ad_query',\n 'ad_reward',\n 'adunit_exposure',\n 'app_background',\n 'app_clear_data',\n 'app_exception',\n 'app_remove',\n 'app_store_refund',\n 'app_store_subscription_cancel',\n 'app_store_subscription_convert',\n 'app_store_subscription_renew',\n 'app_update',\n 'app_upgrade',\n 'dynamic_link_app_open',\n 'dynamic_link_app_update',\n 'dynamic_link_first_open',\n 'error',\n 'first_open',\n 'first_visit',\n 'in_app_purchase',\n 'notification_dismiss',\n 'notification_foreground',\n 'notification_open',\n 'notification_receive',\n 'os_update',\n 'session_start',\n 'session_start_with_rollout',\n 'user_engagement',\n];\n"],"mappings":";AAAO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/track/index.ts
21
+ var track_exports = {};
22
+ __export(track_exports, {
23
+ track: () => track
24
+ });
25
+ module.exports = __toCommonJS(track_exports);
26
+ var import_limiter = require("limiter");
27
+ var import_setup = require("../setup/index.cjs");
28
+ var import_visitor = require("../visitor/index.cjs");
29
+ var defaultOptions = { enableThirdPartyTracking: true };
30
+ var REQUEST_TOKENS = 2;
31
+ var tokenBucket = new import_limiter.TokenBucket({
32
+ bucketSize: 20,
33
+ interval: "second",
34
+ tokensPerInterval: 1
35
+ });
36
+ async function trackAsync(name, properties, trackOptions = defaultOptions) {
37
+ var _a, _b;
38
+ try {
39
+ await tokenBucket.removeTokens(REQUEST_TOKENS);
40
+ const dto = {
41
+ name,
42
+ properties,
43
+ tags: await import_setup.config.getTags(),
44
+ visitor_id: (await (0, import_visitor.getVisitor)()).id,
45
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
46
+ };
47
+ const { data } = await import_setup.config.http.post(`/events`, dto);
48
+ if (!trackOptions.enableThirdPartyTracking || !import_setup.config.thirdPartyTrackers) return;
49
+ import_setup.config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));
50
+ (_a = trackOptions.onSucceed) == null ? void 0 : _a.call(trackOptions, data);
51
+ } catch (e) {
52
+ if (e instanceof Error) {
53
+ console.log("Failed to send track event:", e.message);
54
+ }
55
+ (_b = trackOptions.onError) == null ? void 0 : _b.call(trackOptions, e);
56
+ }
57
+ }
58
+ function track(name, properties, trackOptions = defaultOptions) {
59
+ trackAsync(name, properties, trackOptions).catch(console.error);
60
+ }
61
+ // Annotate the CommonJS export names for ESM import in node:
62
+ 0 && (module.exports = {
63
+ track
64
+ });
65
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from 'limiter';\nimport {\n CreateTrackEventDTO,\n EventName,\n TrackProperties,\n TrackEventResponse,\n} from '../types/index';\nimport { config } from '../setup/index';\nimport { getVisitor } from '../visitor/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\n\nconst REQUEST_TOKENS = 2;\nconst tokenBucket = new TokenBucket({\n bucketSize: 20,\n interval: 'second',\n tokensPerInterval: 1,\n});\n\nasync function trackAsync<T extends EventName = EventName>(\n name: T,\n properties?: TrackProperties<T>,\n trackOptions: TrackOptions = defaultOptions\n) {\n try {\n await tokenBucket.removeTokens(REQUEST_TOKENS);\n const dto: CreateTrackEventDTO<T> = {\n name,\n properties,\n tags: await config.getTags(),\n visitor_id: (await getVisitor()).id,\n timestamp: new Date().toISOString(),\n };\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto);\n\n // send to third-party loggers, for example Google Analytics and Facebook Pixel\n if (!trackOptions.enableThirdPartyTracking || !config.thirdPartyTrackers) return;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));\n trackOptions.onSucceed?.(data);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.log('Failed to send track event:', e.message);\n }\n trackOptions.onError?.(e);\n }\n}\n\nexport function track<T extends EventName = EventName>(\n name: T,\n properties?: TrackProperties<T>,\n trackOptions: TrackOptions = defaultOptions\n) {\n trackAsync(name, properties, trackOptions).catch(console.error);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAA4B;AAO5B,mBAAuB;AACvB,qBAA2B;AAQ3B,IAAM,iBAA+B,EAAE,0BAA0B,KAAK;AAEtE,IAAM,iBAAiB;AACvB,IAAM,cAAc,IAAI,2BAAY;AAAA,EAClC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AACrB,CAAC;AAED,eAAe,WACb,MACA,YACA,eAA6B,gBAC7B;AA7BF;AA8BE,MAAI;AACF,UAAM,YAAY,aAAa,cAAc;AAC7C,UAAM,MAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA,MAAM,MAAM,oBAAO,QAAQ;AAAA,MAC3B,aAAa,UAAM,2BAAW,GAAG;AAAA,MACjC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAM,EAAE,KAAK,IAAI,MAAM,oBAAO,KAAK,KAAyB,WAAW,GAAG;AAG1E,QAAI,CAAC,aAAa,4BAA4B,CAAC,oBAAO,mBAAoB;AAC1E,wBAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,KAAK,EAAE,CAAC;AACjF,uBAAa,cAAb,sCAAyB;AAAA,EAC3B,SAAS,GAAY;AACnB,QAAI,aAAa,OAAO;AACtB,cAAQ,IAAI,+BAA+B,EAAE,OAAO;AAAA,IACtD;AACA,uBAAa,YAAb,sCAAuB;AAAA,EACzB;AACF;AAEO,SAAS,MACd,MACA,YACA,eAA6B,gBAC7B;AACA,aAAW,MAAM,YAAY,YAAY,EAAE,MAAM,QAAQ,KAAK;AAChE;","names":[]}
@@ -0,0 +1,10 @@
1
+ import { EventName, TrackProperties, TrackEventResponse } from '../types/index.cjs';
2
+
3
+ interface TrackOptions {
4
+ enableThirdPartyTracking?: boolean;
5
+ onSucceed?: (response?: TrackEventResponse) => void;
6
+ onError?: (error: unknown) => void;
7
+ }
8
+ declare function track<T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
+
10
+ export { type TrackOptions, track };
@@ -0,0 +1,10 @@
1
+ import { EventName, TrackProperties, TrackEventResponse } from '../types/index.js';
2
+
3
+ interface TrackOptions {
4
+ enableThirdPartyTracking?: boolean;
5
+ onSucceed?: (response?: TrackEventResponse) => void;
6
+ onError?: (error: unknown) => void;
7
+ }
8
+ declare function track<T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
+
10
+ export { type TrackOptions, track };
@@ -0,0 +1,40 @@
1
+ // src/track/index.ts
2
+ import { TokenBucket } from "limiter";
3
+ import { config } from "../setup/index.mjs";
4
+ import { getVisitor } from "../visitor/index.mjs";
5
+ var defaultOptions = { enableThirdPartyTracking: true };
6
+ var REQUEST_TOKENS = 2;
7
+ var tokenBucket = new TokenBucket({
8
+ bucketSize: 20,
9
+ interval: "second",
10
+ tokensPerInterval: 1
11
+ });
12
+ async function trackAsync(name, properties, trackOptions = defaultOptions) {
13
+ var _a, _b;
14
+ try {
15
+ await tokenBucket.removeTokens(REQUEST_TOKENS);
16
+ const dto = {
17
+ name,
18
+ properties,
19
+ tags: await config.getTags(),
20
+ visitor_id: (await getVisitor()).id,
21
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
22
+ };
23
+ const { data } = await config.http.post(`/events`, dto);
24
+ if (!trackOptions.enableThirdPartyTracking || !config.thirdPartyTrackers) return;
25
+ config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));
26
+ (_a = trackOptions.onSucceed) == null ? void 0 : _a.call(trackOptions, data);
27
+ } catch (e) {
28
+ if (e instanceof Error) {
29
+ console.log("Failed to send track event:", e.message);
30
+ }
31
+ (_b = trackOptions.onError) == null ? void 0 : _b.call(trackOptions, e);
32
+ }
33
+ }
34
+ function track(name, properties, trackOptions = defaultOptions) {
35
+ trackAsync(name, properties, trackOptions).catch(console.error);
36
+ }
37
+ export {
38
+ track
39
+ };
40
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from 'limiter';\nimport {\n CreateTrackEventDTO,\n EventName,\n TrackProperties,\n TrackEventResponse,\n} from '../types/index';\nimport { config } from '../setup/index';\nimport { getVisitor } from '../visitor/index';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\n\nconst REQUEST_TOKENS = 2;\nconst tokenBucket = new TokenBucket({\n bucketSize: 20,\n interval: 'second',\n tokensPerInterval: 1,\n});\n\nasync function trackAsync<T extends EventName = EventName>(\n name: T,\n properties?: TrackProperties<T>,\n trackOptions: TrackOptions = defaultOptions\n) {\n try {\n await tokenBucket.removeTokens(REQUEST_TOKENS);\n const dto: CreateTrackEventDTO<T> = {\n name,\n properties,\n tags: await config.getTags(),\n visitor_id: (await getVisitor()).id,\n timestamp: new Date().toISOString(),\n };\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto);\n\n // send to third-party loggers, for example Google Analytics and Facebook Pixel\n if (!trackOptions.enableThirdPartyTracking || !config.thirdPartyTrackers) return;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));\n trackOptions.onSucceed?.(data);\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.log('Failed to send track event:', e.message);\n }\n trackOptions.onError?.(e);\n }\n}\n\nexport function track<T extends EventName = EventName>(\n name: T,\n properties?: TrackProperties<T>,\n trackOptions: TrackOptions = defaultOptions\n) {\n trackAsync(name, properties, trackOptions).catch(console.error);\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAO5B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAQ3B,IAAM,iBAA+B,EAAE,0BAA0B,KAAK;AAEtE,IAAM,iBAAiB;AACvB,IAAM,cAAc,IAAI,YAAY;AAAA,EAClC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AACrB,CAAC;AAED,eAAe,WACb,MACA,YACA,eAA6B,gBAC7B;AA7BF;AA8BE,MAAI;AACF,UAAM,YAAY,aAAa,cAAc;AAC7C,UAAM,MAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA,MAAM,MAAM,OAAO,QAAQ;AAAA,MAC3B,aAAa,MAAM,WAAW,GAAG;AAAA,MACjC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,KAAyB,WAAW,GAAG;AAG1E,QAAI,CAAC,aAAa,4BAA4B,CAAC,OAAO,mBAAoB;AAC1E,WAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,KAAK,EAAE,CAAC;AACjF,uBAAa,cAAb,sCAAyB;AAAA,EAC3B,SAAS,GAAY;AACnB,QAAI,aAAa,OAAO;AACtB,cAAQ,IAAI,+BAA+B,EAAE,OAAO;AAAA,IACtD;AACA,uBAAa,YAAb,sCAAuB;AAAA,EACzB;AACF;AAEO,SAAS,MACd,MACA,YACA,eAA6B,gBAC7B;AACA,aAAW,MAAM,YAAY,YAAY,EAAE,MAAM,QAAQ,KAAK;AAChE;","names":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+
16
+ // src/types/index.ts
17
+ var types_exports = {};
18
+ module.exports = __toCommonJS(types_exports);
19
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/types/index.ts"],"sourcesContent":["export interface Item {\n item_brand?: string;\n item_id?: string;\n item_name?: string;\n item_category?: string;\n item_category2?: string;\n item_category3?: string;\n item_category4?: string;\n item_category5?: string;\n item_list_id?: string;\n item_list_name?: string;\n item_location_id?: string;\n item_variant?: string;\n quantity?: number;\n price?: number;\n}\n\n/**\n * ref: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag\n * ref: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event\n * */\nexport type StandardEventProperties = {\n // Google Analytics 4 Recommended Events\n add_payment_info: {\n items?: Item[];\n currency?: string;\n value?: number;\n coupon?: string;\n payment_type?: string;\n };\n add_shipping_info: {\n items?: Item[];\n currency?: string;\n value?: number;\n coupon?: string;\n shipping_tier?: string;\n };\n add_to_cart: {\n items?: Item[];\n currency?: string;\n value?: number;\n };\n add_to_wishlist: {\n items?: Item[];\n currency?: string;\n value?: number;\n };\n begin_checkout: {\n currency?: string;\n value?: number;\n coupon?: string;\n items?: Item[];\n [key: string]: any;\n };\n close_convert_lead: { currency: string; value: number };\n close_unconvert_lead: { currency: string; value: number; unconvert_lead_reason?: string };\n disqualify_lead: { currency: string; value: number; disqualified_lead_reason?: string };\n earn_virtual_currency: { virtual_currency_name: string; value: number };\n generate_lead: { currency?: string; value?: number };\n join_group: { group_id: string };\n level_end: { level: number; success?: string };\n level_start: { level: number };\n level_up: { level: number; character?: string };\n login: { method: string };\n post_score: { score: number; level?: number; character?: string };\n purchase: {\n affiliation?: string;\n coupon?: string;\n currency?: string;\n items?: Item[];\n shipping?: number;\n tax?: number;\n value?: number;\n transaction_id?: string;\n [key: string]: any;\n };\n qualify_lead: { currency: string; value: number };\n refund: {\n affiliation?: string;\n coupon?: string;\n currency?: string;\n items?: Item[];\n shipping?: number;\n tax?: number;\n value?: number;\n transaction_id?: string;\n };\n remove_from_cart: { items?: Item[]; value?: number; currency?: string };\n search: {\n search_term: string;\n number_of_nights?: number;\n number_of_rooms?: number;\n number_of_passengers?: number;\n origin?: string;\n destination?: string;\n start_date?: string;\n end_date?: string;\n travel_class?: string;\n };\n select_content: { content_type: string; item_id: string };\n select_item: {\n items?: Item[];\n content_type: string;\n item_list_id: string;\n item_list_name: string;\n };\n select_promotion: {\n creative_name: string;\n creative_slot: string;\n items?: Item[];\n location_id: string;\n promotion_id: string;\n promotion_name: string;\n };\n share: {\n content_type: string;\n item_id: string;\n method: string;\n activity_type?: string | null;\n post_id?: string;\n };\n sign_up: { method: string };\n spend_virtual_currency: { item_name: string; virtual_currency_name: string; value: number };\n tutorial_begin: undefined;\n tutorial_complete: undefined;\n unlock_achievement: { achievement_id: string };\n view_cart: { items?: Item[]; currency?: string; value?: number };\n view_item: { items?: Item[]; currency?: string; value?: number };\n view_item_list: { items?: Item[]; item_list_id?: string; item_list_name?: string };\n view_promotion: {\n items?: Item[];\n location_id?: string;\n creative_name?: string;\n creative_slot?: string;\n promotion_id?: string;\n promotion_name?: string;\n };\n working_lead: { currency: string; value: number; lead_status?: string };\n\n // Firebase Analytics events, event_name 40 characters limit, 25 parameters limit\n ad_impression: {\n value?: number;\n currency?: string;\n ad_format?: string;\n ad_platform?: string;\n ad_source?: string;\n ad_unit_name?: string;\n };\n app_open: undefined;\n campaign_details: {\n source: string;\n medium: string;\n campaign: string;\n term?: string;\n content?: string;\n aclid?: string;\n cp1?: string;\n };\n screen_view: { screen_name?: string; screen_class?: string };\n view_search_results: { search_term: string };\n};\n\nexport type AllowedPropertyValues = string | number | boolean | null;\nexport type EventName = Lowercase<string>;\nexport type CustomEventProperties = Record<Lowercase<string>, AllowedPropertyValues>;\n\nexport type TrackProperties<T extends EventName = EventName> =\n T extends keyof StandardEventProperties ? StandardEventProperties[T] : CustomEventProperties;\n\nexport interface UserData {\n userId: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n dateOfBirth?: string;\n gender?: string;\n city?: string;\n state?: string;\n postal?: string;\n country?: string;\n}\n\nexport type ThirdPartyTracker = <T extends EventName = EventName>(\n name: T,\n properties?: TrackProperties<T>,\n event_id?: string\n) => void;\n\nexport interface PlatformInfo {\n os?: string;\n os_name?: string;\n os_version?: string;\n browser?: string;\n browser_name?: string;\n browser_version?: string;\n platform?: 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';\n}\n\nexport interface DeviceInfo {\n device?: string;\n device_id?: string;\n device_type?: string;\n device_vendor?: string;\n device_pixel_ratio?: string;\n screen_resolution?: `${number}x${number}`;\n}\n\nexport interface EnvironmentInfo {\n release?: string;\n language?: string;\n timezone?: string;\n environment?: 'development' | 'production';\n}\n\nexport interface SourceInfo {\n source_url?: string;\n source?: 'app' | 'web' | 'offline';\n}\n\nexport interface ThirdPartyFields {\n /**\n * Meta pixel fields\n * ref: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters#fbc\n * Stored in the _fbc/_fbp browser cookie under your domain\n */\n fbc?: string;\n fbp?: string;\n /**\n * Google Analytics fields\n */\n gclid?: string;\n}\n\nexport interface UTMParams {\n utm_source?: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_term?: string;\n utm_content?: string;\n}\n\nexport interface TrackTags\n extends PlatformInfo,\n DeviceInfo,\n EnvironmentInfo,\n SourceInfo,\n ThirdPartyFields,\n UTMParams {\n [key: string]: string | undefined;\n}\n\nexport interface CreateTrackEventDTO<T extends EventName = EventName> {\n name: string;\n tags: TrackTags;\n visitor_id: string;\n properties?: TrackProperties<T>;\n timestamp: string;\n}\n\nexport interface TrackEventResponse {\n /**\n * track event id\n * some tracking system will use event_id and event_name for deduplication\n * */\n id: string;\n}\n\nexport type VisitorProperties = Record<Lowercase<string>, AllowedPropertyValues>;\n\nexport interface Visitor {\n id: string;\n device_id: string;\n properties: VisitorProperties;\n}\n\nexport interface CreateVisitorDTO {\n device_id: string;\n properties?: VisitorProperties;\n}\n\nexport interface UpdateVisitorDTO {\n properties: VisitorProperties;\n}\n\nexport type ThirdPartyUserSetter = (properties: VisitorProperties) => void;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}