@shware/analytics 0.1.17 → 0.1.18

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 (67) hide show
  1. package/dist/index.cjs.map +1 -1
  2. package/dist/index.d.cts +3 -1
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.mjs.map +1 -1
  5. package/dist/next/index.cjs +102 -5
  6. package/dist/next/index.cjs.map +1 -1
  7. package/dist/next/index.d.cts +21 -2
  8. package/dist/next/index.d.ts +21 -2
  9. package/dist/next/index.mjs +89 -4
  10. package/dist/next/index.mjs.map +1 -1
  11. package/dist/react-router/index.cjs +91 -4
  12. package/dist/react-router/index.cjs.map +1 -1
  13. package/dist/react-router/index.d.cts +21 -2
  14. package/dist/react-router/index.d.ts +21 -2
  15. package/dist/react-router/index.mjs +88 -3
  16. package/dist/react-router/index.mjs.map +1 -1
  17. package/dist/schema/index.d.cts +8 -8
  18. package/dist/schema/index.d.ts +8 -8
  19. package/dist/setup/index.cjs.map +1 -1
  20. package/dist/setup/index.d.cts +3 -1
  21. package/dist/setup/index.d.ts +3 -1
  22. package/dist/setup/index.mjs.map +1 -1
  23. package/dist/track/fbq.cjs +143 -0
  24. package/dist/track/fbq.cjs.map +1 -0
  25. package/dist/track/fbq.d.cts +278 -0
  26. package/dist/track/fbq.d.ts +278 -0
  27. package/dist/track/fbq.mjs +117 -0
  28. package/dist/track/fbq.mjs.map +1 -0
  29. package/dist/track/{ga.cjs → gtag.cjs} +5 -5
  30. package/dist/track/gtag.cjs.map +1 -0
  31. package/dist/track/gtag.d.cts +463 -0
  32. package/dist/track/gtag.d.ts +463 -0
  33. package/dist/track/{ga.mjs → gtag.mjs} +2 -2
  34. package/dist/track/gtag.mjs.map +1 -0
  35. package/dist/track/index.cjs.map +1 -1
  36. package/dist/track/index.d.cts +3 -2
  37. package/dist/track/index.d.ts +3 -2
  38. package/dist/track/index.mjs.map +1 -1
  39. package/dist/{types/index.cjs → track/types.cjs} +2 -2
  40. package/dist/track/types.cjs.map +1 -0
  41. package/dist/track/types.d.cts +87 -0
  42. package/dist/track/types.d.ts +87 -0
  43. package/dist/track/types.mjs +1 -0
  44. package/dist/visitor/index.cjs.map +1 -1
  45. package/dist/visitor/index.d.cts +1 -1
  46. package/dist/visitor/index.d.ts +1 -1
  47. package/dist/visitor/index.mjs.map +1 -1
  48. package/dist/visitor/types.cjs +19 -0
  49. package/dist/visitor/types.cjs.map +1 -0
  50. package/dist/visitor/types.d.cts +16 -0
  51. package/dist/visitor/types.d.ts +16 -0
  52. package/dist/visitor/types.mjs +1 -0
  53. package/dist/visitor/types.mjs.map +1 -0
  54. package/dist/web/index.cjs.map +1 -1
  55. package/dist/web/index.d.cts +2 -1
  56. package/dist/web/index.d.ts +2 -1
  57. package/dist/web/index.mjs.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/track/ga.cjs.map +0 -1
  60. package/dist/track/ga.d.cts +0 -4
  61. package/dist/track/ga.d.ts +0 -4
  62. package/dist/track/ga.mjs.map +0 -1
  63. package/dist/types/index.cjs.map +0 -1
  64. package/dist/types/index.d.cts +0 -327
  65. package/dist/types/index.d.ts +0 -327
  66. package/dist/types/index.mjs +0 -1
  67. /package/dist/{types/index.mjs.map → track/types.mjs.map} +0 -0
@@ -0,0 +1,463 @@
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
+ type GaId = `G-${Uppercase<string>}`;
4
+ type GtmId = `GTM-${Uppercase<string>}`;
5
+ type CampaignMedium = 'email' | 'organic' | 'cpc' | 'banner' | 'social' | 'referral' | 'affiliate' | 'video' | 'display' | 'sms' | 'push' | 'qr' | 'audio' | (string & {});
6
+ type CampaignSource = 'google' | 'googleads' | 'bing' | 'bingads' | 'metaads' | 'facebook' | 'twitter' | 'linkedin' | 'instagram' | 'tiktok' | 'youtube' | 'newsletter' | `website_${string}` | `affiliate_${string}` | (string & {});
7
+ type Campaign = {
8
+ id?: string;
9
+ name?: string;
10
+ term?: string;
11
+ content?: string;
12
+ medium?: CampaignMedium;
13
+ source?: CampaignSource;
14
+ };
15
+ type Config = {
16
+ allow_google_signals?: boolean;
17
+ allow_ad_personalization_signals?: boolean;
18
+ campaign_content?: string;
19
+ campaign_id?: string;
20
+ campaign_medium?: CampaignMedium;
21
+ campaign_name?: string;
22
+ campaign_source?: CampaignSource;
23
+ campaign_term?: string;
24
+ /**
25
+ * @deprecated
26
+ * Key Point: Use the campaign_ prefixed version of each campaign value instead of this field.
27
+ */
28
+ campaign?: Campaign;
29
+ client_id?: string;
30
+ content_group?: string;
31
+ cookie_domain?: 'none' | 'auto' | string;
32
+ cookie_expires?: number;
33
+ cookie_flags?: string;
34
+ cookie_path?: string;
35
+ cookie_prefix?: string;
36
+ cookie_update?: boolean;
37
+ ignore_referrer?: boolean;
38
+ language?: string;
39
+ page_location?: string;
40
+ page_referrer?: string;
41
+ page_title?: string;
42
+ send_page_view?: boolean;
43
+ screen_resolution?: `${number}x${number}`;
44
+ user_id?: string;
45
+ user_property?: Record<string, string | boolean | number | null | undefined>;
46
+ };
47
+ type Item = {
48
+ item_id: string;
49
+ item_name: string;
50
+ affiliation?: 'Google Store' | (string & {});
51
+ coupon?: string;
52
+ discount?: number;
53
+ index?: number;
54
+ item_brand?: string;
55
+ item_category?: string;
56
+ item_category2?: string;
57
+ item_category3?: string;
58
+ item_category4?: string;
59
+ item_category5?: string;
60
+ item_list_id?: string;
61
+ item_list_name?: string;
62
+ item_variant?: string;
63
+ location_id?: string;
64
+ price?: number;
65
+ quantity?: number;
66
+ };
67
+ type PromotionItem = {
68
+ creative_name?: string;
69
+ creative_slot?: string;
70
+ promotion_id?: string;
71
+ promotion_name?: string;
72
+ };
73
+ /**
74
+ * ref: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag
75
+ * ref: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event
76
+ * */
77
+ type StandardEvents = {
78
+ add_payment_info: {
79
+ currency: string;
80
+ value: number;
81
+ coupon?: string;
82
+ payment_type?: string;
83
+ items: Item[];
84
+ };
85
+ add_shipping_info: {
86
+ currency: string;
87
+ value: number;
88
+ coupon?: string;
89
+ shipping_tier?: string;
90
+ items: Item[];
91
+ };
92
+ add_to_cart: {
93
+ currency: string;
94
+ value: number;
95
+ items: Item[];
96
+ };
97
+ add_to_wishlist: {
98
+ currency: string;
99
+ value: number;
100
+ items: Item[];
101
+ };
102
+ begin_checkout: {
103
+ currency: string;
104
+ value: number;
105
+ coupon?: string;
106
+ items: Item[];
107
+ };
108
+ close_convert_lead: {
109
+ currency: string;
110
+ value: number;
111
+ };
112
+ close_unconvert_lead: {
113
+ currency: string;
114
+ value: number;
115
+ unconvert_lead_reason?: string;
116
+ };
117
+ disqualify_lead: {
118
+ currency: string;
119
+ value: number;
120
+ disqualified_lead_reason?: string;
121
+ };
122
+ earn_virtual_currency: {
123
+ virtual_currency_name?: string;
124
+ value?: number;
125
+ };
126
+ generate_lead: {
127
+ currency: string;
128
+ value: number;
129
+ lead_source?: string;
130
+ };
131
+ join_group: {
132
+ group_id?: string;
133
+ };
134
+ level_end: {
135
+ level_name?: string;
136
+ success?: boolean;
137
+ };
138
+ level_start: {
139
+ level_name?: string;
140
+ };
141
+ level_up: {
142
+ level?: number;
143
+ level_name?: string;
144
+ character?: string;
145
+ };
146
+ login: {
147
+ method?: string;
148
+ };
149
+ post_score: {
150
+ score: number;
151
+ level?: number;
152
+ character?: string;
153
+ };
154
+ purchase: {
155
+ currency: string;
156
+ value: number;
157
+ transaction_id: string;
158
+ coupon?: string;
159
+ shipping?: number;
160
+ tax?: number;
161
+ items?: Item[];
162
+ };
163
+ qualify_lead: {
164
+ currency: string;
165
+ value: number;
166
+ };
167
+ refund: {
168
+ currency: string;
169
+ value: number;
170
+ transaction_id: string;
171
+ coupon?: string;
172
+ shipping?: number;
173
+ tax?: number;
174
+ items?: Item[];
175
+ };
176
+ remove_from_cart: {
177
+ currency: string;
178
+ value: number;
179
+ items: Item[];
180
+ };
181
+ search: {
182
+ search_term: string;
183
+ };
184
+ select_content: {
185
+ content_type?: string;
186
+ content_id?: string;
187
+ };
188
+ select_item: {
189
+ item_list_id?: string;
190
+ item_list_name?: string;
191
+ items: Item[];
192
+ };
193
+ select_promotion: {
194
+ creative_name?: string;
195
+ creative_slot?: string;
196
+ promotion_id?: string;
197
+ promotion_name?: string;
198
+ items?: (Item & PromotionItem)[];
199
+ };
200
+ share: {
201
+ method?: string;
202
+ content_type?: string;
203
+ item_id?: string;
204
+ };
205
+ sign_up: {
206
+ method?: string;
207
+ };
208
+ spend_virtual_currency: {
209
+ value: number;
210
+ virtual_currency_name: string;
211
+ item_name?: string;
212
+ };
213
+ tutorial_begin: undefined;
214
+ tutorial_complete: undefined;
215
+ unlock_achievement: {
216
+ achievement_id: string;
217
+ };
218
+ view_cart: {
219
+ currency: string;
220
+ value: number;
221
+ items: Item[];
222
+ };
223
+ view_item: {
224
+ currency: string;
225
+ value: number;
226
+ items: Item[];
227
+ };
228
+ view_item_list: {
229
+ currency: string;
230
+ item_list_id?: string;
231
+ item_list_name?: string;
232
+ items: Item[];
233
+ };
234
+ view_promotion: {
235
+ creative_name?: string;
236
+ creative_slot?: string;
237
+ promotion_id?: string;
238
+ promotion_name?: string;
239
+ items: (Item & PromotionItem)[];
240
+ };
241
+ working_lead: {
242
+ currency: string;
243
+ value: number;
244
+ lead_status?: string;
245
+ };
246
+ ad_impression: {
247
+ value?: number;
248
+ currency?: string;
249
+ ad_format?: string;
250
+ ad_platform?: string;
251
+ ad_source?: string;
252
+ ad_unit_name?: string;
253
+ };
254
+ app_open: undefined;
255
+ campaign_details: {
256
+ source: string;
257
+ medium: string;
258
+ campaign: string;
259
+ term?: string;
260
+ content?: string;
261
+ aclid?: string;
262
+ cp1?: string;
263
+ };
264
+ screen_view: {
265
+ screen_name?: string;
266
+ screen_class?: string;
267
+ };
268
+ view_search_results: {
269
+ search_term: string;
270
+ };
271
+ trial_begin: {
272
+ currency: string;
273
+ value: number;
274
+ };
275
+ subscribe: {
276
+ currency: string;
277
+ value: number;
278
+ };
279
+ };
280
+ /**
281
+ * reference: https://developers.google.com/analytics/devguides/collection/ga4/reference/config
282
+ * reference: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag
283
+ */
284
+ interface Gtag {
285
+ /**
286
+ * To disable advertising features based on third-party advertising identifiers, set
287
+ * allow_google_signals to false.
288
+ *
289
+ * @param allow - Whether to allow Google signals.
290
+ * @default true
291
+ */
292
+ gtag(event: 'set', option: 'allow_google_signals', allow: boolean): void;
293
+ /**
294
+ * Set to false to disable advertising personalization features.
295
+ *
296
+ * @param allow - Whether to allow ad personalization signals.
297
+ * @default true
298
+ */
299
+ gtag(event: 'set', option: 'allow_ad_personalization_signals', allow: boolean): void;
300
+ /**
301
+ * Used for A/B testing and content-targeted ads. Use campaign_content to differentiate ads or
302
+ * links that point to the same URL.
303
+ */
304
+ gtag(event: 'set', option: 'campaign_content', content: string): void;
305
+ /**
306
+ * Used to identify which campaign this referral references. Use campaign_id to identify a
307
+ * specific campaign.
308
+ */
309
+ gtag(event: 'set', option: 'campaign_id', id: string): void;
310
+ /** Use campaign_medium to identify a medium such as email or cost-per-click. */
311
+ gtag(event: 'set', option: 'campaign_medium', medium: CampaignMedium): void;
312
+ /**
313
+ * Used for keyword analysis. Use campaign_name to identify a specific product promotion or
314
+ * strategic campaign.
315
+ */
316
+ gtag(event: 'set', option: 'campaign_name', name: string): void;
317
+ /** Use campaign_source to identify a search engine, newsletter name, or other source. */
318
+ gtag(event: 'set', option: 'campaign_source', source: CampaignSource): void;
319
+ /** Used for paid search. Use campaign_term to note the keywords for this ad. */
320
+ gtag(event: 'set', option: 'campaign_term', term: string): void;
321
+ /**
322
+ * @deprecated
323
+ * Key Point: Use the campaign_ prefixed version of each campaign value instead of this field.
324
+ */
325
+ gtag(event: 'set', option: 'campaign', params: Campaign): void;
326
+ /**
327
+ * Pseudonymously identifies a browser instance. By default, this value is stored as part of the
328
+ * first-party Analytics cookie with a two-year expiration.
329
+ */
330
+ gtag(event: 'set', option: 'client_id', id: string): void;
331
+ /** example: gtag('set', 'content_group', '/news/sports'); */
332
+ gtag(event: 'set', option: 'content_group', group: string): void;
333
+ /**
334
+ * Specifies the domain used to store the analytics cookie.
335
+ * Set to 'none' to set the cookie without specifying a domain.
336
+ * Set to 'auto' (the default value) to set the cookie to the top level domain plus one
337
+ * subdomain (eTLD +1). For example if cookie_domain is set to 'auto' https://example.com would
338
+ * use example.com for the domain, and https://subdomain.example.com would also use example.com
339
+ * for the domain.
340
+ *
341
+ * @param domain - The domain used to store the analytics cookie.
342
+ * @default 'auto'
343
+ */
344
+ gtag(event: 'set', option: 'cookie_domain', domain: 'none' | 'auto' | string): void;
345
+ /**
346
+ * Every time a hit is sent to Google Analytics, the cookie expiration time is updated to be the
347
+ * current time plus the value of the cookie_expires field. This means that if you use the default
348
+ * value time of two years (63072000 seconds), and a user visits your site every month, their
349
+ * cookie will never expire.
350
+ *
351
+ * If you set the cookie_expires time to 0 (zero) seconds, the cookie turns into a session based
352
+ * cookie and expires once the current browser session ends.
353
+ *
354
+ * Caution: If you set the cookie to expire too quickly, you will inflate your user count and
355
+ * decrease the quality of your measurement.
356
+ *
357
+ * @param expires - The number of seconds until the cookie expires.
358
+ * @default 63072000
359
+ */
360
+ gtag(event: 'set', option: 'cookie_expires', expires: number): void;
361
+ /**
362
+ * Appends additional flags to the cookie when set. Flags must be separated by semicolons. See
363
+ * [write a new cookie](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#write_a_new_cookie) for some examples of flags to set.
364
+ */
365
+ gtag(event: 'set', option: 'cookie_flags', flags: string): void;
366
+ /** Specifies the subpath used to store the analytics cookie. */
367
+ gtag(event: 'set', option: 'cookie_path', path: string): void;
368
+ /** Specifies a prefix to prepend to analytics cookie names. */
369
+ gtag(event: 'set', option: 'cookie_prefix', prefix: string): void;
370
+ /**
371
+ * When cookie_update is set to true, gtag.js will update cookies on each page load. This will
372
+ * update the cookie expiration to be set relative to the most recent visit to the site. For
373
+ * example, if cookie expiration is set to one week, and a user visits using the same browser
374
+ * every five days, the cookie expiration will be updated on each visit and will effectively
375
+ * never expire.
376
+ *
377
+ * When set to false, cookies are not updated on each page load. This has the effect of cookie
378
+ * expiration being relative to the first time a user visited the site.
379
+ *
380
+ * @param update - Whether to update the cookie on each page load.
381
+ * @default true
382
+ */
383
+ gtag(event: 'set', option: 'cookie_update', update: boolean): void;
384
+ /**
385
+ * Set to true to indicate to Analytics that the referrer shouldn't be displayed as a traffic
386
+ * source. [Learn when to use this field](https://support.google.com/analytics/answer/10327750#set-parameter)
387
+ *
388
+ * @param ignore - Whether to ignore the referrer.
389
+ * @default false
390
+ */
391
+ gtag(event: 'set', option: 'ignore_referrer', ignore: boolean): void;
392
+ /**
393
+ * Specifies the language preference of the user. Defaults to the user's navigator.language value.
394
+ *
395
+ * @param language - The language preference of the user.
396
+ * @default navigator.language
397
+ */
398
+ gtag(event: 'set', option: 'language', language: string): void;
399
+ /**
400
+ * Specifies the full URL of the page. Defaults to the user's document.location value.
401
+ *
402
+ * @param location - The full URL of the page. Character limit 1000
403
+ * @default document.location
404
+ */
405
+ gtag(event: 'set', option: 'page_location', location: string): void;
406
+ /**
407
+ * Specifies which referral source brought traffic to a page. This value is also used to compute
408
+ * the traffic source. The format of this value is a URL. Defaults to the user's document.referrer
409
+ * value.
410
+ *
411
+ * @param referrer - The referral source. Character limit 420
412
+ * @default document.referrer
413
+ */
414
+ gtag(event: 'set', option: 'page_referrer', referrer: string): void;
415
+ /**
416
+ * The title of the page or document. Defaults to the user's document.title value.
417
+ *
418
+ * @param title - The title of the page or document. Character limit 300
419
+ * @default document.title
420
+ */
421
+ gtag(event: 'set', option: 'page_title', title: string): void;
422
+ /**
423
+ * Set to false to prevent the default snippet from sending a page_view.
424
+ *
425
+ * @param send - Whether to send a page_view.
426
+ * @default true
427
+ */
428
+ gtag(event: 'set', option: 'send_page_view', send: boolean): void;
429
+ /**
430
+ * Specifies the resolution of the screen. Should be two positive integers separated by an x. For
431
+ * example, for an 800px by 600px screen, the value would be 800x600. Calculated from the user's
432
+ * window.screen value.
433
+ *
434
+ * @param resolution - The resolution of the screen.
435
+ * @default window.screen
436
+ */
437
+ gtag(event: 'set', option: 'screen_resolution', resolution: `${number}x${number}`): void;
438
+ /**
439
+ * Specifies a known identifier for a user provided by the site owner/library user. It must not
440
+ * itself be PII (personally identifiable information). The value should never be persisted in
441
+ * Google Analytics cookies or other Analytics provided storage.
442
+ *
443
+ * @param userId - The user ID. Character limit 256
444
+ */
445
+ gtag(event: 'set', option: 'user_id', userId: string): void;
446
+ /**
447
+ * User properties are attributes that can be used to describe segments of your user base, such
448
+ * as language preference or geographic location. Up to 25 additional user properties can be set
449
+ * per project.
450
+ *
451
+ * @param name - The name of the user property. Character limit 24
452
+ * @param value - The value of the user property. Character limit 36
453
+ */
454
+ gtag(event: 'set', option: 'user_property', properties: Record<string, string | boolean | number | null | undefined>): void;
455
+ /**
456
+ * gtag('config', ...) Set for a single stream
457
+ * gtag('set', ...) Set globally
458
+ */
459
+ gtag(event: 'config', gaId: GaId, config?: Config): void;
460
+ gtag<T extends string>(event: 'event', eventName: T extends keyof StandardEvents ? T : string, eventParams?: T extends keyof StandardEvents ? StandardEvents[T] : Record<string, string | number | boolean | null | undefined>): void;
461
+ }
462
+
463
+ export { type Campaign, type CampaignMedium, type CampaignSource, type Config, type GaId, type Gtag, type GtmId, type Item, type PromotionItem, type StandardEvents, reservedEventNames, standardEventNames };
@@ -1,4 +1,4 @@
1
- // src/track/ga.ts
1
+ // src/track/gtag.ts
2
2
  var standardEventNames = [
3
3
  "add_payment_info",
4
4
  "add_shipping_info",
@@ -73,4 +73,4 @@ export {
73
73
  reservedEventNames,
74
74
  standardEventNames
75
75
  };
76
- //# sourceMappingURL=ga.mjs.map
76
+ //# sourceMappingURL=gtag.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/gtag.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\nexport type GaId = `G-${Uppercase<string>}`;\nexport type GtmId = `GTM-${Uppercase<string>}`;\n\nexport type CampaignMedium =\n | 'email'\n | 'organic'\n | 'cpc'\n | 'banner'\n | 'social'\n | 'referral'\n | 'affiliate'\n | 'video'\n | 'display'\n | 'sms'\n | 'push'\n | 'qr'\n | 'audio'\n | (string & {});\n\nexport type CampaignSource =\n | 'google' // don't need to set\n | 'googleads'\n | 'bing'\n | 'bingads'\n | 'metaads'\n | 'facebook'\n | 'twitter'\n | 'linkedin'\n | 'instagram'\n | 'tiktok'\n | 'youtube'\n | 'newsletter'\n | `website_${string}`\n | `affiliate_${string}`\n | (string & {});\n\nexport type Campaign = {\n id?: string;\n name?: string;\n term?: string;\n content?: string;\n medium?: CampaignMedium;\n source?: CampaignSource;\n};\n\nexport type Config = {\n allow_google_signals?: boolean;\n allow_ad_personalization_signals?: boolean;\n\n campaign_content?: string;\n campaign_id?: string;\n campaign_medium?: CampaignMedium;\n campaign_name?: string;\n campaign_source?: CampaignSource;\n campaign_term?: string;\n\n /**\n * @deprecated\n * Key Point: Use the campaign_ prefixed version of each campaign value instead of this field.\n */\n campaign?: Campaign;\n\n client_id?: string;\n content_group?: string;\n\n cookie_domain?: 'none' | 'auto' | string;\n cookie_expires?: number;\n cookie_flags?: string;\n cookie_path?: string;\n cookie_prefix?: string;\n cookie_update?: boolean;\n\n ignore_referrer?: boolean;\n language?: string;\n\n page_location?: string;\n page_referrer?: string;\n page_title?: string;\n\n send_page_view?: boolean;\n screen_resolution?: `${number}x${number}`;\n user_id?: string;\n user_property?: Record<string, string | boolean | number | null | undefined>;\n};\n\nexport type Item = {\n item_id: string;\n item_name: string;\n affiliation?: 'Google Store' | (string & {});\n coupon?: string;\n discount?: number;\n index?: number;\n item_brand?: 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_variant?: string;\n location_id?: string;\n price?: number;\n quantity?: number;\n};\n\nexport type PromotionItem = {\n creative_name?: string;\n creative_slot?: string;\n promotion_id?: string;\n promotion_name?: string;\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 StandardEvents = {\n // Google Analytics 4 Recommended Events\n add_payment_info: {\n currency: string;\n value: number;\n coupon?: string;\n payment_type?: string;\n items: Item[];\n };\n add_shipping_info: {\n currency: string;\n value: number;\n coupon?: string;\n shipping_tier?: string;\n items: Item[];\n };\n add_to_cart: {\n currency: string;\n value: number;\n items: Item[];\n };\n add_to_wishlist: {\n currency: string;\n value: number;\n items: Item[];\n };\n begin_checkout: {\n currency: string;\n value: number;\n coupon?: string;\n items: Item[];\n };\n close_convert_lead: {\n currency: string;\n value: number;\n };\n close_unconvert_lead: {\n currency: string;\n value: number;\n unconvert_lead_reason?: string;\n };\n disqualify_lead: {\n currency: string;\n value: number;\n disqualified_lead_reason?: string;\n };\n earn_virtual_currency: {\n virtual_currency_name?: string;\n value?: number;\n };\n generate_lead: {\n currency: string;\n value: number;\n lead_source?: string;\n };\n join_group: {\n group_id?: string;\n };\n level_end: {\n level_name?: string;\n success?: boolean;\n };\n level_start: {\n level_name?: string;\n };\n level_up: {\n level?: number;\n level_name?: string;\n character?: string;\n };\n login: {\n method?: string;\n };\n post_score: {\n score: number;\n level?: number;\n character?: string;\n };\n purchase: {\n currency: string;\n value: number;\n transaction_id: string;\n coupon?: string;\n shipping?: number; // Shipping cost associated with a transaction.\n tax?: number;\n items?: Item[];\n };\n qualify_lead: {\n currency: string;\n value: number;\n };\n refund: {\n currency: string;\n value: number;\n transaction_id: string;\n coupon?: string;\n shipping?: number;\n tax?: number;\n items?: Item[];\n };\n remove_from_cart: {\n currency: string;\n value: number;\n items: Item[];\n };\n search: {\n search_term: string;\n };\n select_content: {\n content_type?: string;\n content_id?: string;\n };\n select_item: {\n item_list_id?: string;\n item_list_name?: string;\n items: Item[];\n };\n select_promotion: {\n creative_name?: string;\n creative_slot?: string;\n promotion_id?: string;\n promotion_name?: string;\n items?: (Item & PromotionItem)[];\n };\n share: {\n method?: string;\n content_type?: string;\n item_id?: string;\n };\n sign_up: {\n method?: string;\n };\n spend_virtual_currency: {\n value: number;\n virtual_currency_name: string;\n item_name?: string;\n };\n tutorial_begin: undefined;\n tutorial_complete: undefined;\n unlock_achievement: {\n achievement_id: string;\n };\n view_cart: {\n currency: string;\n value: number;\n items: Item[];\n };\n view_item: {\n currency: string;\n value: number;\n items: Item[];\n };\n view_item_list: {\n currency: string;\n item_list_id?: string;\n item_list_name?: string;\n items: Item[];\n };\n view_promotion: {\n creative_name?: string;\n creative_slot?: string;\n promotion_id?: string;\n promotion_name?: string;\n items: (Item & PromotionItem)[];\n };\n working_lead: {\n currency: string;\n value: number;\n lead_status?: string;\n };\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 // Added events\n trial_begin: {\n currency: string;\n value: number;\n };\n\n subscribe: {\n currency: string;\n value: number;\n };\n};\n\n/**\n * reference: https://developers.google.com/analytics/devguides/collection/ga4/reference/config\n * reference: https://developers.google.com/analytics/devguides/collection/ga4/reference/events?client_type=gtag\n */\nexport interface Gtag {\n /**\n * To disable advertising features based on third-party advertising identifiers, set\n * allow_google_signals to false.\n *\n * @param allow - Whether to allow Google signals.\n * @default true\n */\n gtag(event: 'set', option: 'allow_google_signals', allow: boolean): void;\n\n /**\n * Set to false to disable advertising personalization features.\n *\n * @param allow - Whether to allow ad personalization signals.\n * @default true\n */\n gtag(event: 'set', option: 'allow_ad_personalization_signals', allow: boolean): void;\n\n /**\n * Used for A/B testing and content-targeted ads. Use campaign_content to differentiate ads or\n * links that point to the same URL.\n */\n gtag(event: 'set', option: 'campaign_content', content: string): void;\n\n /**\n * Used to identify which campaign this referral references. Use campaign_id to identify a\n * specific campaign.\n */\n gtag(event: 'set', option: 'campaign_id', id: string): void;\n\n /** Use campaign_medium to identify a medium such as email or cost-per-click. */\n gtag(event: 'set', option: 'campaign_medium', medium: CampaignMedium): void;\n\n /**\n * Used for keyword analysis. Use campaign_name to identify a specific product promotion or\n * strategic campaign.\n */\n gtag(event: 'set', option: 'campaign_name', name: string): void;\n\n /** Use campaign_source to identify a search engine, newsletter name, or other source. */\n gtag(event: 'set', option: 'campaign_source', source: CampaignSource): void;\n\n /** Used for paid search. Use campaign_term to note the keywords for this ad. */\n gtag(event: 'set', option: 'campaign_term', term: string): void;\n\n /**\n * @deprecated\n * Key Point: Use the campaign_ prefixed version of each campaign value instead of this field.\n */\n gtag(event: 'set', option: 'campaign', params: Campaign): void;\n\n /**\n * Pseudonymously identifies a browser instance. By default, this value is stored as part of the\n * first-party Analytics cookie with a two-year expiration.\n */\n gtag(event: 'set', option: 'client_id', id: string): void;\n\n /** example: gtag('set', 'content_group', '/news/sports'); */\n gtag(event: 'set', option: 'content_group', group: string): void;\n\n /**\n * Specifies the domain used to store the analytics cookie.\n * Set to 'none' to set the cookie without specifying a domain.\n * Set to 'auto' (the default value) to set the cookie to the top level domain plus one\n * subdomain (eTLD +1). For example if cookie_domain is set to 'auto' https://example.com would\n * use example.com for the domain, and https://subdomain.example.com would also use example.com\n * for the domain.\n *\n * @param domain - The domain used to store the analytics cookie.\n * @default 'auto'\n */\n gtag(event: 'set', option: 'cookie_domain', domain: 'none' | 'auto' | string): void;\n\n /**\n * Every time a hit is sent to Google Analytics, the cookie expiration time is updated to be the\n * current time plus the value of the cookie_expires field. This means that if you use the default\n * value time of two years (63072000 seconds), and a user visits your site every month, their\n * cookie will never expire.\n *\n * If you set the cookie_expires time to 0 (zero) seconds, the cookie turns into a session based\n * cookie and expires once the current browser session ends.\n *\n * Caution: If you set the cookie to expire too quickly, you will inflate your user count and\n * decrease the quality of your measurement.\n *\n * @param expires - The number of seconds until the cookie expires.\n * @default 63072000\n */\n gtag(event: 'set', option: 'cookie_expires', expires: number): void;\n\n /**\n * Appends additional flags to the cookie when set. Flags must be separated by semicolons. See\n * [write a new cookie](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#write_a_new_cookie) for some examples of flags to set.\n */\n gtag(event: 'set', option: 'cookie_flags', flags: string): void;\n\n /** Specifies the subpath used to store the analytics cookie. */\n gtag(event: 'set', option: 'cookie_path', path: string): void;\n\n /** Specifies a prefix to prepend to analytics cookie names. */\n gtag(event: 'set', option: 'cookie_prefix', prefix: string): void;\n\n /**\n * When cookie_update is set to true, gtag.js will update cookies on each page load. This will\n * update the cookie expiration to be set relative to the most recent visit to the site. For\n * example, if cookie expiration is set to one week, and a user visits using the same browser\n * every five days, the cookie expiration will be updated on each visit and will effectively\n * never expire.\n *\n * When set to false, cookies are not updated on each page load. This has the effect of cookie\n * expiration being relative to the first time a user visited the site.\n *\n * @param update - Whether to update the cookie on each page load.\n * @default true\n */\n gtag(event: 'set', option: 'cookie_update', update: boolean): void;\n\n /**\n * Set to true to indicate to Analytics that the referrer shouldn't be displayed as a traffic\n * source. [Learn when to use this field](https://support.google.com/analytics/answer/10327750#set-parameter)\n *\n * @param ignore - Whether to ignore the referrer.\n * @default false\n */\n gtag(event: 'set', option: 'ignore_referrer', ignore: boolean): void;\n\n /**\n * Specifies the language preference of the user. Defaults to the user's navigator.language value.\n *\n * @param language - The language preference of the user.\n * @default navigator.language\n */\n gtag(event: 'set', option: 'language', language: string): void;\n\n /**\n * Specifies the full URL of the page. Defaults to the user's document.location value.\n *\n * @param location - The full URL of the page. Character limit 1000\n * @default document.location\n */\n gtag(event: 'set', option: 'page_location', location: string): void;\n\n /**\n * Specifies which referral source brought traffic to a page. This value is also used to compute\n * the traffic source. The format of this value is a URL. Defaults to the user's document.referrer\n * value.\n *\n * @param referrer - The referral source. Character limit 420\n * @default document.referrer\n */\n gtag(event: 'set', option: 'page_referrer', referrer: string): void;\n\n /**\n * The title of the page or document. Defaults to the user's document.title value.\n *\n * @param title - The title of the page or document. Character limit 300\n * @default document.title\n */\n gtag(event: 'set', option: 'page_title', title: string): void;\n\n /**\n * Set to false to prevent the default snippet from sending a page_view.\n *\n * @param send - Whether to send a page_view.\n * @default true\n */\n gtag(event: 'set', option: 'send_page_view', send: boolean): void;\n\n /**\n * Specifies the resolution of the screen. Should be two positive integers separated by an x. For\n * example, for an 800px by 600px screen, the value would be 800x600. Calculated from the user's\n * window.screen value.\n *\n * @param resolution - The resolution of the screen.\n * @default window.screen\n */\n gtag(event: 'set', option: 'screen_resolution', resolution: `${number}x${number}`): void;\n\n /**\n * Specifies a known identifier for a user provided by the site owner/library user. It must not\n * itself be PII (personally identifiable information). The value should never be persisted in\n * Google Analytics cookies or other Analytics provided storage.\n *\n * @param userId - The user ID. Character limit 256\n */\n gtag(event: 'set', option: 'user_id', userId: string): void;\n\n /**\n * User properties are attributes that can be used to describe segments of your user base, such\n * as language preference or geographic location. Up to 25 additional user properties can be set\n * per project.\n *\n * @param name - The name of the user property. Character limit 24\n * @param value - The value of the user property. Character limit 36\n */\n gtag(\n event: 'set',\n option: 'user_property',\n properties: Record<string, string | boolean | number | null | undefined>\n ): void;\n\n /**\n * gtag('config', ...) Set for a single stream\n * gtag('set', ...) Set globally\n */\n gtag(event: 'config', gaId: GaId, config?: Config): void;\n\n gtag<T extends string>(\n event: 'event',\n eventName: T extends keyof StandardEvents ? T : string,\n eventParams?: T extends keyof StandardEvents\n ? StandardEvents[T]\n : Record<string, string | number | boolean | null | undefined>\n ): void;\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":[]}
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from 'limiter';\nimport { config } from '../setup/index';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackName,\n TrackProperties,\n TrackEventResponse,\n} from './types';\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>(\n name: TrackName<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: TrackName<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;AAC5B,mBAAuB;AACvB,qBAA2B;AAe3B,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;AA9BF;AA+BE,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":[]}
@@ -1,10 +1,11 @@
1
- import { EventName, TrackProperties, TrackEventResponse } from '../types/index.cjs';
1
+ import { EventName, TrackName, TrackProperties, TrackEventResponse } from './types.cjs';
2
+ import './gtag.cjs';
2
3
 
3
4
  interface TrackOptions {
4
5
  enableThirdPartyTracking?: boolean;
5
6
  onSucceed?: (response?: TrackEventResponse) => void;
6
7
  onError?: (error: unknown) => void;
7
8
  }
8
- declare function track<T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
+ declare function track<T extends EventName = EventName>(name: TrackName<T>, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
10
 
10
11
  export { type TrackOptions, track };
@@ -1,10 +1,11 @@
1
- import { EventName, TrackProperties, TrackEventResponse } from '../types/index.js';
1
+ import { EventName, TrackName, TrackProperties, TrackEventResponse } from './types.js';
2
+ import './gtag.js';
2
3
 
3
4
  interface TrackOptions {
4
5
  enableThirdPartyTracking?: boolean;
5
6
  onSucceed?: (response?: TrackEventResponse) => void;
6
7
  onError?: (error: unknown) => void;
7
8
  }
8
- declare function track<T extends EventName = EventName>(name: T, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
+ declare function track<T extends EventName = EventName>(name: TrackName<T>, properties?: TrackProperties<T>, trackOptions?: TrackOptions): void;
9
10
 
10
11
  export { type TrackOptions, track };
@@ -1 +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":[]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from 'limiter';\nimport { config } from '../setup/index';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackName,\n TrackProperties,\n TrackEventResponse,\n} from './types';\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>(\n name: TrackName<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: TrackName<T>,\n properties?: TrackProperties<T>,\n trackOptions: TrackOptions = defaultOptions\n) {\n trackAsync(name, properties, trackOptions).catch(console.error);\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAe3B,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;AA9BF;AA+BE,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":[]}
@@ -13,7 +13,7 @@ var __copyProps = (to, from, except, desc) => {
13
13
  };
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
15
 
16
- // src/types/index.ts
16
+ // src/track/types.ts
17
17
  var types_exports = {};
18
18
  module.exports = __toCommonJS(types_exports);
19
- //# sourceMappingURL=index.cjs.map
19
+ //# sourceMappingURL=types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/track/types.ts"],"sourcesContent":["import type { StandardEvents } from './gtag';\n\nexport type { Item } from './gtag';\n\nexport type AllowedPropertyValues = string | number | boolean | null;\nexport type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'FID' | 'INP' | 'LCP' | 'TTFB';\n\nexport type TrackName<T extends EventName> = T extends keyof StandardEvents ? T : EventName;\nexport type TrackProperties<T extends EventName> = T extends keyof StandardEvents\n ? StandardEvents[T]\n : Record<Lowercase<string>, AllowedPropertyValues>;\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>(\n name: TrackName<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"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}