@shware/analytics 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,201 @@
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 key2 of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key2) && key2 !== except)
16
+ __defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || 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/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ createTrackEventSchema: () => createTrackEventSchema,
34
+ createVisitorSchema: () => createVisitorSchema,
35
+ getVisitor: () => getVisitor,
36
+ setVisitor: () => setVisitor,
37
+ setupAnalytics: () => setupAnalytics,
38
+ track: () => track,
39
+ updateVisitorSchema: () => updateVisitorSchema
40
+ });
41
+ module.exports = __toCommonJS(src_exports);
42
+
43
+ // src/setup.ts
44
+ var import_axios = __toESM(require("axios"), 1);
45
+ var import_axios_retry = __toESM(require("axios-retry"), 1);
46
+ var config = {
47
+ http: null,
48
+ release: "0.0.0",
49
+ storage: null,
50
+ getTags: null,
51
+ getDeviceId: null,
52
+ thirdPartyTrackers: [],
53
+ thirdPartyUserSetters: []
54
+ };
55
+ function setupAnalytics(init) {
56
+ config.release = init.release;
57
+ config.storage = init.storage;
58
+ config.getTags = init.getTags;
59
+ config.getDeviceId = init.getDeviceId;
60
+ config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];
61
+ config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];
62
+ config.http = import_axios.default.create({ baseURL: init.endpoint, withCredentials: true, adapter: "fetch" });
63
+ (0, import_axios_retry.default)(config.http, { retries: 5, retryDelay: import_axios_retry.default.exponentialDelay });
64
+ }
65
+
66
+ // src/track.ts
67
+ var import_limiter = require("limiter");
68
+
69
+ // src/visitor.ts
70
+ var key = "visitor_id";
71
+ async function getOrCreateVisitor() {
72
+ const visitorId = await config.storage.getItem(key);
73
+ if (visitorId) {
74
+ const response = await config.http.get(`/visitors/${visitorId}`);
75
+ return response.data;
76
+ } else {
77
+ const dto = {
78
+ device_id: await config.getDeviceId(),
79
+ properties: await config.getTags()
80
+ };
81
+ const response = await config.http.post(`/visitors`, dto);
82
+ await config.storage.setItem(key, response.data.id);
83
+ return response.data;
84
+ }
85
+ }
86
+ var visitor = null;
87
+ var visitorFetcher = null;
88
+ async function getVisitor() {
89
+ if (visitor) return visitor;
90
+ if (visitorFetcher) return visitorFetcher;
91
+ visitorFetcher = getOrCreateVisitor();
92
+ visitor = await visitorFetcher;
93
+ visitorFetcher = null;
94
+ return visitor;
95
+ }
96
+ async function setVisitor(properties) {
97
+ const dto = { properties };
98
+ const { id } = await getVisitor();
99
+ const response = await config.http.patch(`/visitors/${id}`, dto);
100
+ config.thirdPartyUserSetters.forEach((setter) => setter(properties));
101
+ visitor = response.data;
102
+ return response.data;
103
+ }
104
+
105
+ // src/track.ts
106
+ var defaultOptions = { enableThirdPartyTracking: true };
107
+ var REQUEST_TOKENS = 2;
108
+ var tokenBucket = new import_limiter.TokenBucket({
109
+ bucketSize: 20,
110
+ interval: "second",
111
+ tokensPerInterval: 1
112
+ });
113
+ async function trackAsync(name, properties, trackOptions = defaultOptions) {
114
+ var _a, _b;
115
+ try {
116
+ await tokenBucket.removeTokens(REQUEST_TOKENS);
117
+ const dto = {
118
+ name,
119
+ properties,
120
+ tags: await config.getTags(),
121
+ visitor_id: (await getVisitor()).id,
122
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
123
+ };
124
+ const { data } = await config.http.post(`/events`, dto);
125
+ if (!trackOptions.enableThirdPartyTracking || !config.thirdPartyTrackers) return;
126
+ config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));
127
+ (_a = trackOptions.onSucceed) == null ? void 0 : _a.call(trackOptions, data);
128
+ } catch (e) {
129
+ if (e instanceof Error) {
130
+ console.log("Failed to send track event:", e.message);
131
+ }
132
+ (_b = trackOptions.onError) == null ? void 0 : _b.call(trackOptions, e);
133
+ }
134
+ }
135
+ function track(name, properties, trackOptions = defaultOptions) {
136
+ trackAsync(name, properties, trackOptions).catch(console.error);
137
+ }
138
+
139
+ // src/schema.ts
140
+ var import_zod = require("zod");
141
+ var createTrackEventSchema = import_zod.z.object({
142
+ name: import_zod.z.string().trim().min(1).max(64),
143
+ visitor_id: import_zod.z.coerce.bigint(),
144
+ tags: import_zod.z.object({
145
+ os: import_zod.z.string().optional(),
146
+ os_name: import_zod.z.string().optional(),
147
+ os_version: import_zod.z.string().optional(),
148
+ browser: import_zod.z.string().optional(),
149
+ browser_name: import_zod.z.string().optional(),
150
+ browser_version: import_zod.z.string().optional(),
151
+ platform: import_zod.z.enum(["ios", "android", "web", "macos", "windows", "linux", "unknown"]).optional(),
152
+ device: import_zod.z.string().optional(),
153
+ device_id: import_zod.z.string().trim().min(1).max(36).optional(),
154
+ device_type: import_zod.z.string().optional(),
155
+ device_vendor: import_zod.z.string().optional(),
156
+ device_pixel_ratio: import_zod.z.string().optional(),
157
+ screen_resolution: import_zod.z.string().regex(/^\d+x\d+$/).transform((v) => v).optional(),
158
+ release: import_zod.z.string().optional(),
159
+ language: import_zod.z.string().optional(),
160
+ timezone: import_zod.z.string().optional(),
161
+ environment: import_zod.z.enum(["development", "production"]).optional(),
162
+ source_url: import_zod.z.string().optional(),
163
+ source: import_zod.z.enum(["web", "app", "offline"]).optional(),
164
+ fbc: import_zod.z.string().optional(),
165
+ fbp: import_zod.z.string().optional(),
166
+ gclid: import_zod.z.string().optional(),
167
+ utm_source: import_zod.z.string().optional(),
168
+ utm_medium: import_zod.z.string().optional(),
169
+ utm_campaign: import_zod.z.string().optional(),
170
+ utm_term: import_zod.z.string().optional(),
171
+ utm_content: import_zod.z.string().optional()
172
+ }),
173
+ properties: import_zod.z.record(
174
+ import_zod.z.string().trim().min(1).max(128),
175
+ import_zod.z.union([import_zod.z.string().max(512), import_zod.z.number(), import_zod.z.boolean(), import_zod.z.null()])
176
+ ).refine((data) => Object.keys(data).length <= 64)
177
+ });
178
+ var createVisitorSchema = import_zod.z.object({
179
+ device_id: import_zod.z.string().trim().min(1).max(36),
180
+ properties: import_zod.z.record(
181
+ import_zod.z.string().trim().min(1).max(128),
182
+ import_zod.z.union([import_zod.z.string().max(512), import_zod.z.number(), import_zod.z.boolean(), import_zod.z.null()])
183
+ ).refine((data) => Object.keys(data).length <= 64)
184
+ });
185
+ var updateVisitorSchema = import_zod.z.object({
186
+ properties: import_zod.z.record(
187
+ import_zod.z.string().trim().min(1).max(128),
188
+ import_zod.z.union([import_zod.z.string().max(512), import_zod.z.number(), import_zod.z.boolean(), import_zod.z.null()])
189
+ ).refine((data) => Object.keys(data).length <= 64)
190
+ });
191
+ // Annotate the CommonJS export names for ESM import in node:
192
+ 0 && (module.exports = {
193
+ createTrackEventSchema,
194
+ createVisitorSchema,
195
+ getVisitor,
196
+ setVisitor,
197
+ setupAnalytics,
198
+ track,
199
+ updateVisitorSchema
200
+ });
201
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/setup.ts","../src/track.ts","../src/visitor.ts","../src/schema.ts"],"sourcesContent":["export { setupAnalytics } from './setup';\nexport { track } from './track';\nexport { getVisitor, setVisitor } from './visitor';\nexport { createTrackEventSchema, createVisitorSchema, updateVisitorSchema } from './schema';\nexport { type VisitorProperties, type TrackProperties, type TrackTags } from './types';\n","import axios, { AxiosInstance } from 'axios';\nimport retry from 'axios-retry';\nimport { ThirdPartyTracker, ThirdPartyUserSetter, TrackTags } from './types';\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","import { TokenBucket } from 'limiter';\nimport { CreateTrackEventDTO, EventName, TrackProperties, TrackEventResponse } from './types';\nimport { config } from './setup';\nimport { getVisitor } from './visitor';\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","import { config } from './setup';\nimport type { CreateVisitorDTO, UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\n\nconst key = 'visitor_id';\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = await config.storage.getItem(key);\n if (visitorId) {\n const response = await config.http.get<Visitor>(`/visitors/${visitorId}`);\n return response.data;\n } else {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n properties: (await config.getTags()) as VisitorProperties,\n };\n const response = await config.http.post<Visitor>(`/visitors`, dto);\n await config.storage.setItem(key, response.data.id);\n return response.data;\n }\n}\n\nlet visitor: Visitor | null = null;\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (visitor) return visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n visitor = await visitorFetcher;\n visitorFetcher = null;\n return visitor;\n}\n\nexport async function setVisitor(properties: VisitorProperties) {\n const dto: UpdateVisitorDTO = { properties };\n const { id } = await getVisitor();\n const response = await config.http.patch<Visitor>(`/visitors/${id}`, dto);\n config.thirdPartyUserSetters.forEach((setter) => setter(properties));\n visitor = response.data;\n return response.data;\n}\n","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":["axios","retry"]}
@@ -1,6 +1,304 @@
1
- import { T as TrackTags, a as ThirdPartyTracker, b as ThirdPartyUserSetter, E as EventName, c as TrackProperties, d as TrackEventResponse, V as Visitor, e as VisitorProperties } from './shared/analytics.BsiFCGfy.mjs';
2
1
  import { z } from 'zod';
3
2
 
3
+ interface Item {
4
+ item_brand?: string;
5
+ item_id?: string;
6
+ item_name?: string;
7
+ item_category?: string;
8
+ item_category2?: string;
9
+ item_category3?: string;
10
+ item_category4?: string;
11
+ item_category5?: string;
12
+ item_list_id?: string;
13
+ item_list_name?: string;
14
+ item_location_id?: string;
15
+ item_variant?: string;
16
+ quantity?: number;
17
+ price?: number;
18
+ }
19
+ /**
20
+ * ref: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag
21
+ * ref: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event
22
+ * */
23
+ type StandardEventProperties = {
24
+ add_payment_info: {
25
+ items?: Item[];
26
+ currency?: string;
27
+ value?: number;
28
+ coupon?: string;
29
+ payment_type?: string;
30
+ };
31
+ add_shipping_info: {
32
+ items?: Item[];
33
+ currency?: string;
34
+ value?: number;
35
+ coupon?: string;
36
+ shipping_tier?: string;
37
+ };
38
+ add_to_cart: {
39
+ items?: Item[];
40
+ currency?: string;
41
+ value?: number;
42
+ };
43
+ add_to_wishlist: {
44
+ items?: Item[];
45
+ currency?: string;
46
+ value?: number;
47
+ };
48
+ begin_checkout: {
49
+ currency?: string;
50
+ value?: number;
51
+ coupon?: string;
52
+ items?: Item[];
53
+ [key: string]: any;
54
+ };
55
+ close_convert_lead: {
56
+ currency: string;
57
+ value: number;
58
+ };
59
+ close_unconvert_lead: {
60
+ currency: string;
61
+ value: number;
62
+ unconvert_lead_reason?: string;
63
+ };
64
+ disqualify_lead: {
65
+ currency: string;
66
+ value: number;
67
+ disqualified_lead_reason?: string;
68
+ };
69
+ earn_virtual_currency: {
70
+ virtual_currency_name: string;
71
+ value: number;
72
+ };
73
+ generate_lead: {
74
+ currency?: string;
75
+ value?: number;
76
+ };
77
+ join_group: {
78
+ group_id: string;
79
+ };
80
+ level_end: {
81
+ level: number;
82
+ success?: string;
83
+ };
84
+ level_start: {
85
+ level: number;
86
+ };
87
+ level_up: {
88
+ level: number;
89
+ character?: string;
90
+ };
91
+ login: {
92
+ method: string;
93
+ };
94
+ post_score: {
95
+ score: number;
96
+ level?: number;
97
+ character?: string;
98
+ };
99
+ purchase: {
100
+ affiliation?: string;
101
+ coupon?: string;
102
+ currency?: string;
103
+ items?: Item[];
104
+ shipping?: number;
105
+ tax?: number;
106
+ value?: number;
107
+ transaction_id?: string;
108
+ [key: string]: any;
109
+ };
110
+ qualify_lead: {
111
+ currency: string;
112
+ value: number;
113
+ };
114
+ refund: {
115
+ affiliation?: string;
116
+ coupon?: string;
117
+ currency?: string;
118
+ items?: Item[];
119
+ shipping?: number;
120
+ tax?: number;
121
+ value?: number;
122
+ transaction_id?: string;
123
+ };
124
+ remove_from_cart: {
125
+ items?: Item[];
126
+ value?: number;
127
+ currency?: string;
128
+ };
129
+ search: {
130
+ search_term: string;
131
+ number_of_nights?: number;
132
+ number_of_rooms?: number;
133
+ number_of_passengers?: number;
134
+ origin?: string;
135
+ destination?: string;
136
+ start_date?: string;
137
+ end_date?: string;
138
+ travel_class?: string;
139
+ };
140
+ select_content: {
141
+ content_type: string;
142
+ item_id: string;
143
+ };
144
+ select_item: {
145
+ items?: Item[];
146
+ content_type: string;
147
+ item_list_id: string;
148
+ item_list_name: string;
149
+ };
150
+ select_promotion: {
151
+ creative_name: string;
152
+ creative_slot: string;
153
+ items?: Item[];
154
+ location_id: string;
155
+ promotion_id: string;
156
+ promotion_name: string;
157
+ };
158
+ share: {
159
+ content_type: string;
160
+ item_id: string;
161
+ method: string;
162
+ activity_type?: string | null;
163
+ post_id?: string;
164
+ };
165
+ sign_up: {
166
+ method: string;
167
+ };
168
+ spend_virtual_currency: {
169
+ item_name: string;
170
+ virtual_currency_name: string;
171
+ value: number;
172
+ };
173
+ tutorial_begin: undefined;
174
+ tutorial_complete: undefined;
175
+ unlock_achievement: {
176
+ achievement_id: string;
177
+ };
178
+ view_cart: {
179
+ items?: Item[];
180
+ currency?: string;
181
+ value?: number;
182
+ };
183
+ view_item: {
184
+ items?: Item[];
185
+ currency?: string;
186
+ value?: number;
187
+ };
188
+ view_item_list: {
189
+ items?: Item[];
190
+ item_list_id?: string;
191
+ item_list_name?: string;
192
+ };
193
+ view_promotion: {
194
+ items?: Item[];
195
+ location_id?: string;
196
+ creative_name?: string;
197
+ creative_slot?: string;
198
+ promotion_id?: string;
199
+ promotion_name?: string;
200
+ };
201
+ working_lead: {
202
+ currency: string;
203
+ value: number;
204
+ lead_status?: string;
205
+ };
206
+ ad_impression: {
207
+ value?: number;
208
+ currency?: string;
209
+ ad_format?: string;
210
+ ad_platform?: string;
211
+ ad_source?: string;
212
+ ad_unit_name?: string;
213
+ };
214
+ app_open: undefined;
215
+ campaign_details: {
216
+ source: string;
217
+ medium: string;
218
+ campaign: string;
219
+ term?: string;
220
+ content?: string;
221
+ aclid?: string;
222
+ cp1?: string;
223
+ };
224
+ screen_view: {
225
+ screen_name?: string;
226
+ screen_class?: string;
227
+ };
228
+ view_search_results: {
229
+ search_term: string;
230
+ };
231
+ };
232
+ type AllowedPropertyValues = string | number | boolean | null;
233
+ type EventName = Lowercase<string>;
234
+ type CustomEventProperties = Record<Lowercase<string>, AllowedPropertyValues>;
235
+ type TrackProperties<T extends EventName = EventName> = T extends keyof StandardEventProperties ? StandardEventProperties[T] : CustomEventProperties;
236
+ type ThirdPartyTracker = <T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, event_id?: string) => void;
237
+ interface PlatformInfo {
238
+ os?: string;
239
+ os_name?: string;
240
+ os_version?: string;
241
+ browser?: string;
242
+ browser_name?: string;
243
+ browser_version?: string;
244
+ platform?: 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';
245
+ }
246
+ interface DeviceInfo {
247
+ device?: string;
248
+ device_id?: string;
249
+ device_type?: string;
250
+ device_vendor?: string;
251
+ device_pixel_ratio?: string;
252
+ screen_resolution?: `${number}x${number}`;
253
+ }
254
+ interface EnvironmentInfo {
255
+ release?: string;
256
+ language?: string;
257
+ timezone?: string;
258
+ environment?: 'development' | 'production';
259
+ }
260
+ interface SourceInfo {
261
+ source_url?: string;
262
+ source?: 'app' | 'web' | 'offline';
263
+ }
264
+ interface ThirdPartyFields {
265
+ /**
266
+ * Meta pixel fields
267
+ * ref: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters#fbc
268
+ * Stored in the _fbc/_fbp browser cookie under your domain
269
+ */
270
+ fbc?: string;
271
+ fbp?: string;
272
+ /**
273
+ * Google Analytics fields
274
+ */
275
+ gclid?: string;
276
+ }
277
+ interface UTMParams {
278
+ utm_source?: string;
279
+ utm_medium?: string;
280
+ utm_campaign?: string;
281
+ utm_term?: string;
282
+ utm_content?: string;
283
+ }
284
+ interface TrackTags extends PlatformInfo, DeviceInfo, EnvironmentInfo, SourceInfo, ThirdPartyFields, UTMParams {
285
+ [key: string]: string | undefined;
286
+ }
287
+ interface TrackEventResponse {
288
+ /**
289
+ * track event id
290
+ * some tracking system will use event_id and event_name for deduplication
291
+ * */
292
+ id: string;
293
+ }
294
+ type VisitorProperties = Record<Lowercase<string>, AllowedPropertyValues>;
295
+ interface Visitor {
296
+ id: string;
297
+ device_id: string;
298
+ properties: VisitorProperties;
299
+ }
300
+ type ThirdPartyUserSetter = (properties: VisitorProperties) => void;
301
+
4
302
  interface Storage {
5
303
  getItem: (key: string) => (string | null) | Promise<string | null>;
6
304
  setItem: (key: string, value: string) => void | Promise<void>;
@@ -200,4 +498,4 @@ declare const updateVisitorSchema: z.ZodObject<{
200
498
  properties: Record<string, string | number | boolean | null>;
201
499
  }>;
202
500
 
203
- export { TrackProperties, TrackTags, VisitorProperties, createTrackEventSchema, createVisitorSchema, getVisitor, setVisitor, setupAnalytics, track, updateVisitorSchema };
501
+ export { type TrackProperties, type TrackTags, type VisitorProperties, createTrackEventSchema, createVisitorSchema, getVisitor, setVisitor, setupAnalytics, track, updateVisitorSchema };