@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.
@@ -0,0 +1,501 @@
1
+ import { z } from 'zod';
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
+
302
+ interface Storage {
303
+ getItem: (key: string) => (string | null) | Promise<string | null>;
304
+ setItem: (key: string, value: string) => void | Promise<void>;
305
+ }
306
+ interface Options {
307
+ release: string;
308
+ storage: Storage;
309
+ endpoint: string;
310
+ getTags: () => TrackTags | Promise<TrackTags>;
311
+ getDeviceId: () => string | Promise<string>;
312
+ thirdPartyTrackers?: ThirdPartyTracker[];
313
+ thirdPartyUserSetters?: ThirdPartyUserSetter[];
314
+ }
315
+ declare function setupAnalytics(init: Options): void;
316
+
317
+ interface TrackOptions {
318
+ enableThirdPartyTracking?: boolean;
319
+ onSucceed?: (response?: TrackEventResponse) => void;
320
+ onError?: (error: unknown) => void;
321
+ }
322
+ declare function track<T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
323
+
324
+ declare function getVisitor(): Promise<Visitor>;
325
+ declare function setVisitor(properties: VisitorProperties): Promise<Visitor>;
326
+
327
+ declare const createTrackEventSchema: z.ZodObject<{
328
+ name: z.ZodString;
329
+ visitor_id: z.ZodBigInt;
330
+ tags: z.ZodObject<{
331
+ os: z.ZodOptional<z.ZodString>;
332
+ os_name: z.ZodOptional<z.ZodString>;
333
+ os_version: z.ZodOptional<z.ZodString>;
334
+ browser: z.ZodOptional<z.ZodString>;
335
+ browser_name: z.ZodOptional<z.ZodString>;
336
+ browser_version: z.ZodOptional<z.ZodString>;
337
+ platform: z.ZodOptional<z.ZodEnum<["ios", "android", "web", "macos", "windows", "linux", "unknown"]>>;
338
+ device: z.ZodOptional<z.ZodString>;
339
+ device_id: z.ZodOptional<z.ZodString>;
340
+ device_type: z.ZodOptional<z.ZodString>;
341
+ device_vendor: z.ZodOptional<z.ZodString>;
342
+ device_pixel_ratio: z.ZodOptional<z.ZodString>;
343
+ screen_resolution: z.ZodOptional<z.ZodEffects<z.ZodString, `${number}x${number}`, string>>;
344
+ release: z.ZodOptional<z.ZodString>;
345
+ language: z.ZodOptional<z.ZodString>;
346
+ timezone: z.ZodOptional<z.ZodString>;
347
+ environment: z.ZodOptional<z.ZodEnum<["development", "production"]>>;
348
+ source_url: z.ZodOptional<z.ZodString>;
349
+ source: z.ZodOptional<z.ZodEnum<["web", "app", "offline"]>>;
350
+ fbc: z.ZodOptional<z.ZodString>;
351
+ fbp: z.ZodOptional<z.ZodString>;
352
+ gclid: z.ZodOptional<z.ZodString>;
353
+ utm_source: z.ZodOptional<z.ZodString>;
354
+ utm_medium: z.ZodOptional<z.ZodString>;
355
+ utm_campaign: z.ZodOptional<z.ZodString>;
356
+ utm_term: z.ZodOptional<z.ZodString>;
357
+ utm_content: z.ZodOptional<z.ZodString>;
358
+ }, "strip", z.ZodTypeAny, {
359
+ os?: string | undefined;
360
+ os_name?: string | undefined;
361
+ os_version?: string | undefined;
362
+ browser?: string | undefined;
363
+ browser_name?: string | undefined;
364
+ browser_version?: string | undefined;
365
+ platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
366
+ device?: string | undefined;
367
+ device_id?: string | undefined;
368
+ device_type?: string | undefined;
369
+ device_vendor?: string | undefined;
370
+ device_pixel_ratio?: string | undefined;
371
+ screen_resolution?: `${number}x${number}` | undefined;
372
+ release?: string | undefined;
373
+ language?: string | undefined;
374
+ timezone?: string | undefined;
375
+ environment?: "development" | "production" | undefined;
376
+ source_url?: string | undefined;
377
+ source?: "web" | "app" | "offline" | undefined;
378
+ fbc?: string | undefined;
379
+ fbp?: string | undefined;
380
+ gclid?: string | undefined;
381
+ utm_source?: string | undefined;
382
+ utm_medium?: string | undefined;
383
+ utm_campaign?: string | undefined;
384
+ utm_term?: string | undefined;
385
+ utm_content?: string | undefined;
386
+ }, {
387
+ os?: string | undefined;
388
+ os_name?: string | undefined;
389
+ os_version?: string | undefined;
390
+ browser?: string | undefined;
391
+ browser_name?: string | undefined;
392
+ browser_version?: string | undefined;
393
+ platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
394
+ device?: string | undefined;
395
+ device_id?: string | undefined;
396
+ device_type?: string | undefined;
397
+ device_vendor?: string | undefined;
398
+ device_pixel_ratio?: string | undefined;
399
+ screen_resolution?: string | undefined;
400
+ release?: string | undefined;
401
+ language?: string | undefined;
402
+ timezone?: string | undefined;
403
+ environment?: "development" | "production" | undefined;
404
+ source_url?: string | undefined;
405
+ source?: "web" | "app" | "offline" | undefined;
406
+ fbc?: string | undefined;
407
+ fbp?: string | undefined;
408
+ gclid?: string | undefined;
409
+ utm_source?: string | undefined;
410
+ utm_medium?: string | undefined;
411
+ utm_campaign?: string | undefined;
412
+ utm_term?: string | undefined;
413
+ utm_content?: string | undefined;
414
+ }>;
415
+ properties: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>, Record<string, string | number | boolean | null>, Record<string, string | number | boolean | null>>;
416
+ }, "strip", z.ZodTypeAny, {
417
+ visitor_id: bigint;
418
+ name: string;
419
+ tags: {
420
+ os?: string | undefined;
421
+ os_name?: string | undefined;
422
+ os_version?: string | undefined;
423
+ browser?: string | undefined;
424
+ browser_name?: string | undefined;
425
+ browser_version?: string | undefined;
426
+ platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
427
+ device?: string | undefined;
428
+ device_id?: string | undefined;
429
+ device_type?: string | undefined;
430
+ device_vendor?: string | undefined;
431
+ device_pixel_ratio?: string | undefined;
432
+ screen_resolution?: `${number}x${number}` | undefined;
433
+ release?: string | undefined;
434
+ language?: string | undefined;
435
+ timezone?: string | undefined;
436
+ environment?: "development" | "production" | undefined;
437
+ source_url?: string | undefined;
438
+ source?: "web" | "app" | "offline" | undefined;
439
+ fbc?: string | undefined;
440
+ fbp?: string | undefined;
441
+ gclid?: string | undefined;
442
+ utm_source?: string | undefined;
443
+ utm_medium?: string | undefined;
444
+ utm_campaign?: string | undefined;
445
+ utm_term?: string | undefined;
446
+ utm_content?: string | undefined;
447
+ };
448
+ properties: Record<string, string | number | boolean | null>;
449
+ }, {
450
+ visitor_id: bigint;
451
+ name: string;
452
+ tags: {
453
+ os?: string | undefined;
454
+ os_name?: string | undefined;
455
+ os_version?: string | undefined;
456
+ browser?: string | undefined;
457
+ browser_name?: string | undefined;
458
+ browser_version?: string | undefined;
459
+ platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
460
+ device?: string | undefined;
461
+ device_id?: string | undefined;
462
+ device_type?: string | undefined;
463
+ device_vendor?: string | undefined;
464
+ device_pixel_ratio?: string | undefined;
465
+ screen_resolution?: string | undefined;
466
+ release?: string | undefined;
467
+ language?: string | undefined;
468
+ timezone?: string | undefined;
469
+ environment?: "development" | "production" | undefined;
470
+ source_url?: string | undefined;
471
+ source?: "web" | "app" | "offline" | undefined;
472
+ fbc?: string | undefined;
473
+ fbp?: string | undefined;
474
+ gclid?: string | undefined;
475
+ utm_source?: string | undefined;
476
+ utm_medium?: string | undefined;
477
+ utm_campaign?: string | undefined;
478
+ utm_term?: string | undefined;
479
+ utm_content?: string | undefined;
480
+ };
481
+ properties: Record<string, string | number | boolean | null>;
482
+ }>;
483
+ declare const createVisitorSchema: z.ZodObject<{
484
+ device_id: z.ZodString;
485
+ properties: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>, Record<string, string | number | boolean | null>, Record<string, string | number | boolean | null>>;
486
+ }, "strip", z.ZodTypeAny, {
487
+ device_id: string;
488
+ properties: Record<string, string | number | boolean | null>;
489
+ }, {
490
+ device_id: string;
491
+ properties: Record<string, string | number | boolean | null>;
492
+ }>;
493
+ declare const updateVisitorSchema: z.ZodObject<{
494
+ properties: z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>, Record<string, string | number | boolean | null>, Record<string, string | number | boolean | null>>;
495
+ }, "strip", z.ZodTypeAny, {
496
+ properties: Record<string, string | number | boolean | null>;
497
+ }, {
498
+ properties: Record<string, string | number | boolean | null>;
499
+ }>;
500
+
501
+ export { type TrackProperties, type TrackTags, type VisitorProperties, createTrackEventSchema, createVisitorSchema, getVisitor, setVisitor, setupAnalytics, track, updateVisitorSchema };
@@ -1,9 +1,7 @@
1
- import axios from 'axios';
2
- import retry from 'axios-retry';
3
- import { TokenBucket } from 'limiter';
4
- import { z } from 'zod';
5
-
6
- const config = {
1
+ // src/setup.ts
2
+ import axios from "axios";
3
+ import retry from "axios-retry";
4
+ var config = {
7
5
  http: null,
8
6
  release: "0.0.0",
9
7
  storage: null,
@@ -23,7 +21,11 @@ function setupAnalytics(init) {
23
21
  retry(config.http, { retries: 5, retryDelay: retry.exponentialDelay });
24
22
  }
25
23
 
26
- const key = "visitor_id";
24
+ // src/track.ts
25
+ import { TokenBucket } from "limiter";
26
+
27
+ // src/visitor.ts
28
+ var key = "visitor_id";
27
29
  async function getOrCreateVisitor() {
28
30
  const visitorId = await config.storage.getItem(key);
29
31
  if (visitorId) {
@@ -39,8 +41,8 @@ async function getOrCreateVisitor() {
39
41
  return response.data;
40
42
  }
41
43
  }
42
- let visitor = null;
43
- let visitorFetcher = null;
44
+ var visitor = null;
45
+ var visitorFetcher = null;
44
46
  async function getVisitor() {
45
47
  if (visitor) return visitor;
46
48
  if (visitorFetcher) return visitorFetcher;
@@ -58,14 +60,16 @@ async function setVisitor(properties) {
58
60
  return response.data;
59
61
  }
60
62
 
61
- const defaultOptions = { enableThirdPartyTracking: true };
62
- const REQUEST_TOKENS = 2;
63
- const tokenBucket = new TokenBucket({
63
+ // src/track.ts
64
+ var defaultOptions = { enableThirdPartyTracking: true };
65
+ var REQUEST_TOKENS = 2;
66
+ var tokenBucket = new TokenBucket({
64
67
  bucketSize: 20,
65
68
  interval: "second",
66
69
  tokensPerInterval: 1
67
70
  });
68
71
  async function trackAsync(name, properties, trackOptions = defaultOptions) {
72
+ var _a, _b;
69
73
  try {
70
74
  await tokenBucket.removeTokens(REQUEST_TOKENS);
71
75
  const dto = {
@@ -78,19 +82,21 @@ async function trackAsync(name, properties, trackOptions = defaultOptions) {
78
82
  const { data } = await config.http.post(`/events`, dto);
79
83
  if (!trackOptions.enableThirdPartyTracking || !config.thirdPartyTrackers) return;
80
84
  config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, data.id));
81
- trackOptions.onSucceed?.(data);
85
+ (_a = trackOptions.onSucceed) == null ? void 0 : _a.call(trackOptions, data);
82
86
  } catch (e) {
83
87
  if (e instanceof Error) {
84
88
  console.log("Failed to send track event:", e.message);
85
89
  }
86
- trackOptions.onError?.(e);
90
+ (_b = trackOptions.onError) == null ? void 0 : _b.call(trackOptions, e);
87
91
  }
88
92
  }
89
93
  function track(name, properties, trackOptions = defaultOptions) {
90
94
  trackAsync(name, properties, trackOptions).catch(console.error);
91
95
  }
92
96
 
93
- const createTrackEventSchema = z.object({
97
+ // src/schema.ts
98
+ import { z } from "zod";
99
+ var createTrackEventSchema = z.object({
94
100
  name: z.string().trim().min(1).max(64),
95
101
  visitor_id: z.coerce.bigint(),
96
102
  tags: z.object({
@@ -127,18 +133,26 @@ const createTrackEventSchema = z.object({
127
133
  z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
128
134
  ).refine((data) => Object.keys(data).length <= 64)
129
135
  });
130
- const createVisitorSchema = z.object({
136
+ var createVisitorSchema = z.object({
131
137
  device_id: z.string().trim().min(1).max(36),
132
138
  properties: z.record(
133
139
  z.string().trim().min(1).max(128),
134
140
  z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
135
141
  ).refine((data) => Object.keys(data).length <= 64)
136
142
  });
137
- const updateVisitorSchema = z.object({
143
+ var updateVisitorSchema = z.object({
138
144
  properties: z.record(
139
145
  z.string().trim().min(1).max(128),
140
146
  z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
141
147
  ).refine((data) => Object.keys(data).length <= 64)
142
148
  });
143
-
144
- export { createTrackEventSchema, createVisitorSchema, getVisitor, setVisitor, setupAnalytics, track, updateVisitorSchema };
149
+ export {
150
+ createTrackEventSchema,
151
+ createVisitorSchema,
152
+ getVisitor,
153
+ setVisitor,
154
+ setupAnalytics,
155
+ track,
156
+ updateVisitorSchema
157
+ };
158
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/setup.ts","../src/track.ts","../src/visitor.ts","../src/schema.ts"],"sourcesContent":["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":[]}
@@ -0,0 +1,29 @@
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/react/index.tsx
21
+ var react_exports = {};
22
+ __export(react_exports, {
23
+ default: () => Analytics
24
+ });
25
+ module.exports = __toCommonJS(react_exports);
26
+ function Analytics() {
27
+ return null;
28
+ }
29
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/index.tsx"],"sourcesContent":["export default function Analytics() {\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAe,SAAR,YAA6B;AAClC,SAAO;AACT;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function Analytics(): null;
2
+
3
+ export { Analytics as default };
@@ -0,0 +1,3 @@
1
+ declare function Analytics(): null;
2
+
3
+ export { Analytics as default };
@@ -0,0 +1,8 @@
1
+ // src/react/index.tsx
2
+ function Analytics() {
3
+ return null;
4
+ }
5
+ export {
6
+ Analytics as default
7
+ };
8
+ //# sourceMappingURL=index.js.map