@shware/analytics 0.3.18 → 0.5.0

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.
@@ -1,185 +1,64 @@
1
- import { z } from 'zod';
1
+ import * as zod_v4_core from 'zod/v4/core';
2
+ import * as zod_v4_mini from 'zod/v4-mini';
3
+ import { iso } from 'zod/v4-mini';
2
4
 
3
- declare const createTrackEventSchema: z.ZodArray<z.ZodObject<{
4
- name: z.ZodString;
5
- visitor_id: z.ZodBigInt;
6
- timestamp: z.ZodString;
7
- tags: z.ZodObject<{
8
- os: z.ZodOptional<z.ZodString>;
9
- os_name: z.ZodOptional<z.ZodString>;
10
- os_version: z.ZodOptional<z.ZodString>;
11
- browser: z.ZodOptional<z.ZodString>;
12
- browser_name: z.ZodOptional<z.ZodString>;
13
- browser_version: z.ZodOptional<z.ZodString>;
14
- platform: z.ZodOptional<z.ZodEnum<["ios", "android", "web", "macos", "windows", "linux", "unknown"]>>;
15
- device: z.ZodOptional<z.ZodString>;
16
- device_id: z.ZodOptional<z.ZodString>;
17
- device_type: z.ZodOptional<z.ZodString>;
18
- device_vendor: z.ZodOptional<z.ZodString>;
19
- device_pixel_ratio: z.ZodOptional<z.ZodString>;
20
- screen_resolution: z.ZodOptional<z.ZodEffects<z.ZodString, `${number}x${number}`, string>>;
21
- release: z.ZodOptional<z.ZodString>;
22
- language: z.ZodOptional<z.ZodString>;
23
- time_zone: z.ZodOptional<z.ZodString>;
24
- environment: z.ZodOptional<z.ZodEnum<["development", "production"]>>;
25
- source_url: z.ZodOptional<z.ZodString>;
26
- source: z.ZodOptional<z.ZodEnum<["web", "app", "offline"]>>;
27
- fbc: z.ZodOptional<z.ZodString>;
28
- fbp: z.ZodOptional<z.ZodString>;
29
- gclid: z.ZodOptional<z.ZodString>;
30
- advertising_id: z.ZodOptional<z.ZodString>;
31
- utm_source: z.ZodOptional<z.ZodString>;
32
- utm_medium: z.ZodOptional<z.ZodString>;
33
- utm_campaign: z.ZodOptional<z.ZodString>;
34
- utm_term: z.ZodOptional<z.ZodString>;
35
- utm_content: z.ZodOptional<z.ZodString>;
36
- }, "strip", z.ZodTypeAny, {
37
- gclid?: string | undefined;
38
- language?: string | undefined;
39
- screen_resolution?: `${number}x${number}` | undefined;
40
- os?: string | undefined;
41
- os_name?: string | undefined;
42
- os_version?: string | undefined;
43
- browser?: string | undefined;
44
- browser_name?: string | undefined;
45
- browser_version?: string | undefined;
46
- platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
47
- device?: string | undefined;
48
- device_id?: string | undefined;
49
- device_type?: string | undefined;
50
- device_vendor?: string | undefined;
51
- device_pixel_ratio?: string | undefined;
52
- release?: string | undefined;
53
- time_zone?: string | undefined;
54
- environment?: "development" | "production" | undefined;
55
- source_url?: string | undefined;
56
- source?: "web" | "app" | "offline" | undefined;
57
- fbc?: string | undefined;
58
- fbp?: string | undefined;
59
- advertising_id?: string | undefined;
60
- utm_source?: string | undefined;
61
- utm_medium?: string | undefined;
62
- utm_campaign?: string | undefined;
63
- utm_term?: string | undefined;
64
- utm_content?: string | undefined;
65
- }, {
66
- gclid?: string | undefined;
67
- language?: string | undefined;
68
- screen_resolution?: string | undefined;
69
- os?: string | undefined;
70
- os_name?: string | undefined;
71
- os_version?: string | undefined;
72
- browser?: string | undefined;
73
- browser_name?: string | undefined;
74
- browser_version?: string | undefined;
75
- platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
76
- device?: string | undefined;
77
- device_id?: string | undefined;
78
- device_type?: string | undefined;
79
- device_vendor?: string | undefined;
80
- device_pixel_ratio?: string | undefined;
81
- release?: string | undefined;
82
- time_zone?: string | undefined;
83
- environment?: "development" | "production" | undefined;
84
- source_url?: string | undefined;
85
- source?: "web" | "app" | "offline" | undefined;
86
- fbc?: string | undefined;
87
- fbp?: string | undefined;
88
- advertising_id?: string | undefined;
89
- utm_source?: string | undefined;
90
- utm_medium?: string | undefined;
91
- utm_campaign?: string | undefined;
92
- utm_term?: string | undefined;
93
- utm_content?: string | undefined;
94
- }>;
95
- properties: z.ZodOptional<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>, "many">]>>, Record<string, string | number | boolean | Record<string, string | number | boolean | null>[] | null>, Record<string, string | number | boolean | Record<string, string | number | boolean | null>[] | null>>>;
96
- }, "strip", z.ZodTypeAny, {
97
- visitor_id: bigint;
98
- name: string;
99
- timestamp: string;
100
- tags: {
101
- gclid?: string | undefined;
102
- language?: string | undefined;
103
- screen_resolution?: `${number}x${number}` | undefined;
104
- os?: string | undefined;
105
- os_name?: string | undefined;
106
- os_version?: string | undefined;
107
- browser?: string | undefined;
108
- browser_name?: string | undefined;
109
- browser_version?: string | undefined;
110
- platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
111
- device?: string | undefined;
112
- device_id?: string | undefined;
113
- device_type?: string | undefined;
114
- device_vendor?: string | undefined;
115
- device_pixel_ratio?: string | undefined;
116
- release?: string | undefined;
117
- time_zone?: string | undefined;
118
- environment?: "development" | "production" | undefined;
119
- source_url?: string | undefined;
120
- source?: "web" | "app" | "offline" | undefined;
121
- fbc?: string | undefined;
122
- fbp?: string | undefined;
123
- advertising_id?: string | undefined;
124
- utm_source?: string | undefined;
125
- utm_medium?: string | undefined;
126
- utm_campaign?: string | undefined;
127
- utm_term?: string | undefined;
128
- utm_content?: string | undefined;
129
- };
130
- properties?: Record<string, string | number | boolean | Record<string, string | number | boolean | null>[] | null> | undefined;
131
- }, {
132
- visitor_id: bigint;
133
- name: string;
134
- timestamp: string;
135
- tags: {
136
- gclid?: string | undefined;
137
- language?: string | undefined;
138
- screen_resolution?: string | undefined;
139
- os?: string | undefined;
140
- os_name?: string | undefined;
141
- os_version?: string | undefined;
142
- browser?: string | undefined;
143
- browser_name?: string | undefined;
144
- browser_version?: string | undefined;
145
- platform?: "ios" | "android" | "web" | "macos" | "windows" | "linux" | "unknown" | undefined;
146
- device?: string | undefined;
147
- device_id?: string | undefined;
148
- device_type?: string | undefined;
149
- device_vendor?: string | undefined;
150
- device_pixel_ratio?: string | undefined;
151
- release?: string | undefined;
152
- time_zone?: string | undefined;
153
- environment?: "development" | "production" | undefined;
154
- source_url?: string | undefined;
155
- source?: "web" | "app" | "offline" | undefined;
156
- fbc?: string | undefined;
157
- fbp?: string | undefined;
158
- advertising_id?: string | undefined;
159
- utm_source?: string | undefined;
160
- utm_medium?: string | undefined;
161
- utm_campaign?: string | undefined;
162
- utm_term?: string | undefined;
163
- utm_content?: string | undefined;
164
- };
165
- properties?: Record<string, string | number | boolean | Record<string, string | number | boolean | null>[] | null> | undefined;
166
- }>, "many">;
167
- declare const createVisitorSchema: z.ZodObject<{
168
- device_id: z.ZodString;
169
- properties: z.ZodOptional<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>>>;
170
- }, "strip", z.ZodTypeAny, {
171
- device_id: string;
172
- properties?: Record<string, string | number | boolean | null> | undefined;
173
- }, {
174
- device_id: string;
175
- properties?: Record<string, string | number | boolean | null> | undefined;
176
- }>;
177
- declare const updateVisitorSchema: z.ZodObject<{
178
- 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>>;
179
- }, "strip", z.ZodTypeAny, {
180
- properties: Record<string, string | number | boolean | null>;
181
- }, {
182
- properties: Record<string, string | number | boolean | null>;
183
- }>;
5
+ declare const createTrackEventSchema: zod_v4_mini.ZodMiniArray<zod_v4_mini.ZodMiniObject<{
6
+ name: zod_v4_mini.ZodMiniString<string>;
7
+ visitor_id: zod_v4_mini.ZodMiniBigInt<unknown>;
8
+ timestamp: iso.ZodMiniISODateTime;
9
+ tags: zod_v4_mini.ZodMiniObject<{
10
+ os: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
11
+ os_name: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
12
+ os_version: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
13
+ browser: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
14
+ browser_name: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
15
+ browser_version: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
16
+ platform: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniEnum<{
17
+ ios: "ios";
18
+ android: "android";
19
+ web: "web";
20
+ macos: "macos";
21
+ windows: "windows";
22
+ linux: "linux";
23
+ unknown: "unknown";
24
+ }>>;
25
+ device: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
26
+ device_id: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
27
+ device_type: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
28
+ device_vendor: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
29
+ device_pixel_ratio: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
30
+ screen_resolution: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniPipe<zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniTransform<`${number}x${number}`, string>>>;
31
+ release: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
32
+ language: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
33
+ time_zone: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
34
+ environment: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniEnum<{
35
+ development: "development";
36
+ production: "production";
37
+ }>>;
38
+ source_url: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
39
+ source: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniEnum<{
40
+ web: "web";
41
+ app: "app";
42
+ offline: "offline";
43
+ }>>;
44
+ fbc: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
45
+ fbp: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
46
+ gclid: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
47
+ advertising_id: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
48
+ utm_source: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
49
+ utm_medium: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
50
+ utm_campaign: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
51
+ utm_term: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
52
+ utm_content: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniString<string>>;
53
+ }, zod_v4_core.$strip>;
54
+ properties: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniRecord<zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniUnion<readonly [zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniNumber<number>, zod_v4_mini.ZodMiniBoolean<boolean>, zod_v4_mini.ZodMiniNull, zod_v4_mini.ZodMiniArray<zod_v4_mini.ZodMiniRecord<zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniUnion<readonly [zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniNumber<number>, zod_v4_mini.ZodMiniBoolean<boolean>, zod_v4_mini.ZodMiniNull]>>>]>>>;
55
+ }, zod_v4_core.$strip>>;
56
+ declare const createVisitorSchema: zod_v4_mini.ZodMiniObject<{
57
+ device_id: zod_v4_mini.ZodMiniString<string>;
58
+ properties: zod_v4_mini.ZodMiniOptional<zod_v4_mini.ZodMiniRecord<zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniUnion<readonly [zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniNumber<number>, zod_v4_mini.ZodMiniBoolean<boolean>, zod_v4_mini.ZodMiniNull]>>>;
59
+ }, zod_v4_core.$strip>;
60
+ declare const updateVisitorSchema: zod_v4_mini.ZodMiniObject<{
61
+ properties: zod_v4_mini.ZodMiniRecord<zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniUnion<readonly [zod_v4_mini.ZodMiniString<string>, zod_v4_mini.ZodMiniNumber<number>, zod_v4_mini.ZodMiniBoolean<boolean>, zod_v4_mini.ZodMiniNull]>>;
62
+ }, zod_v4_core.$strip>;
184
63
 
185
64
  export { createTrackEventSchema, createVisitorSchema, updateVisitorSchema };
@@ -1,62 +1,93 @@
1
1
  // src/schema/index.ts
2
- import { z } from "zod";
3
- var items = z.array(
4
- z.record(
5
- z.string().trim().min(1).max(128),
6
- z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
2
+ import {
3
+ optional,
4
+ object,
5
+ string,
6
+ regex,
7
+ number,
8
+ boolean,
9
+ null as _null,
10
+ coerce,
11
+ enum as _enum,
12
+ trim,
13
+ union,
14
+ record,
15
+ array,
16
+ iso,
17
+ minLength,
18
+ maxLength,
19
+ refine,
20
+ pipe,
21
+ transform
22
+ } from "zod/v4-mini";
23
+ var items = array(
24
+ record(
25
+ string().check(trim(), minLength(1), maxLength(128)),
26
+ union([string().check(maxLength(512)), number(), boolean(), _null()])
7
27
  )
8
28
  );
9
- var createTrackEventSchema = z.object({
10
- name: z.string().trim().min(1).max(64),
11
- visitor_id: z.coerce.bigint(),
12
- timestamp: z.string().datetime(),
13
- tags: z.object({
14
- os: z.string().optional(),
15
- os_name: z.string().optional(),
16
- os_version: z.string().optional(),
17
- browser: z.string().optional(),
18
- browser_name: z.string().optional(),
19
- browser_version: z.string().optional(),
20
- platform: z.enum(["ios", "android", "web", "macos", "windows", "linux", "unknown"]).optional(),
21
- device: z.string().optional(),
22
- device_id: z.string().trim().min(1).max(36).optional(),
23
- device_type: z.string().optional(),
24
- device_vendor: z.string().optional(),
25
- device_pixel_ratio: z.string().optional(),
26
- screen_resolution: z.string().regex(/^\d+x\d+$/).transform((v) => v).optional(),
27
- release: z.string().optional(),
28
- language: z.string().optional(),
29
- time_zone: z.string().optional(),
30
- environment: z.enum(["development", "production"]).optional(),
31
- source_url: z.string().optional(),
32
- source: z.enum(["web", "app", "offline"]).optional(),
33
- fbc: z.string().optional(),
34
- fbp: z.string().optional(),
35
- gclid: z.string().optional(),
36
- advertising_id: z.string().optional(),
37
- utm_source: z.string().optional(),
38
- utm_medium: z.string().optional(),
39
- utm_campaign: z.string().optional(),
40
- utm_term: z.string().optional(),
41
- utm_content: z.string().optional()
42
- }),
43
- properties: z.record(
44
- z.string().trim().min(1).max(128),
45
- z.union([z.string().max(512), z.number(), z.boolean(), z.null(), items])
46
- ).refine((data) => Object.keys(data).length <= 64).optional()
47
- }).array().min(1).max(100);
48
- var createVisitorSchema = z.object({
49
- device_id: z.string().trim().min(1).max(36),
50
- properties: z.record(
51
- z.string().trim().min(1).max(128),
52
- z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
53
- ).refine((data) => Object.keys(data).length <= 64).optional()
29
+ var createTrackEventSchema = array(
30
+ object({
31
+ name: string().check(trim(), minLength(1), maxLength(64)),
32
+ visitor_id: coerce.bigint(),
33
+ timestamp: iso.datetime(),
34
+ tags: object({
35
+ os: optional(string()),
36
+ os_name: optional(string()),
37
+ os_version: optional(string()),
38
+ browser: optional(string()),
39
+ browser_name: optional(string()),
40
+ browser_version: optional(string()),
41
+ platform: optional(_enum(["ios", "android", "web", "macos", "windows", "linux", "unknown"])),
42
+ device: optional(string()),
43
+ device_id: optional(string().check(trim(), minLength(1), maxLength(36))),
44
+ device_type: optional(string()),
45
+ device_vendor: optional(string()),
46
+ device_pixel_ratio: optional(string()),
47
+ screen_resolution: optional(
48
+ pipe(
49
+ string().check(regex(/^\d+x\d+$/)),
50
+ transform((v) => v)
51
+ )
52
+ ),
53
+ release: optional(string()),
54
+ language: optional(string()),
55
+ time_zone: optional(string()),
56
+ environment: optional(_enum(["development", "production"])),
57
+ source_url: optional(string()),
58
+ source: optional(_enum(["web", "app", "offline"])),
59
+ fbc: optional(string()),
60
+ fbp: optional(string()),
61
+ gclid: optional(string()),
62
+ advertising_id: optional(string()),
63
+ utm_source: optional(string()),
64
+ utm_medium: optional(string()),
65
+ utm_campaign: optional(string()),
66
+ utm_term: optional(string()),
67
+ utm_content: optional(string())
68
+ }),
69
+ properties: optional(
70
+ record(
71
+ string().check(trim(), minLength(1), maxLength(128)),
72
+ union([string().check(maxLength(512)), number(), boolean(), _null(), items])
73
+ ).check(refine((data) => Object.keys(data).length <= 64))
74
+ )
75
+ })
76
+ ).check(minLength(1), maxLength(100));
77
+ var createVisitorSchema = object({
78
+ device_id: string().check(trim(), minLength(1), maxLength(36)),
79
+ properties: optional(
80
+ record(
81
+ string().check(trim(), minLength(1), maxLength(128)),
82
+ union([string().check(maxLength(512)), number(), boolean(), _null()])
83
+ ).check(refine((data) => Object.keys(data).length <= 64))
84
+ )
54
85
  });
55
- var updateVisitorSchema = z.object({
56
- properties: z.record(
57
- z.string().trim().min(1).max(128),
58
- z.union([z.string().max(512), z.number(), z.boolean(), z.null()])
59
- ).refine((data) => Object.keys(data).length <= 64)
86
+ var updateVisitorSchema = object({
87
+ properties: record(
88
+ string().check(trim(), minLength(1), maxLength(128)),
89
+ union([string().check(maxLength(512)), number(), boolean(), _null()])
90
+ ).check(refine((data) => Object.keys(data).length <= 64))
60
91
  });
61
92
  export {
62
93
  createTrackEventSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import { z } from 'zod';\n\nconst items = z.array(\n z.record(\n z.string().trim().min(1).max(128),\n z.union([z.string().max(512), z.number(), z.boolean(), z.null()])\n )\n);\n\nexport const createTrackEventSchema = z\n .object({\n name: z.string().trim().min(1).max(64),\n visitor_id: z.coerce.bigint(),\n timestamp: z.string().datetime(),\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\n .enum(['ios', 'android', 'web', 'macos', 'windows', 'linux', 'unknown'])\n .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 time_zone: 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 advertising_id: 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(), items])\n )\n .refine((data) => Object.keys(data).length <= 64)\n .optional(),\n })\n .array()\n .min(1)\n .max(100);\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 .optional(),\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":";AAAA,SAAS,SAAS;AAElB,IAAM,QAAQ,EAAE;AAAA,EACd,EAAE;AAAA,IACA,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAChC,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,EAClE;AACF;AAEO,IAAM,yBAAyB,EACnC,OAAO;AAAA,EACN,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACrC,YAAY,EAAE,OAAO,OAAO;AAAA,EAC5B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,MAAM,EAAE,OAAO;AAAA,IACb,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,IACxB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,IACrC,UAAU,EACP,KAAK,CAAC,OAAO,WAAW,OAAO,SAAS,WAAW,SAAS,SAAS,CAAC,EACtE,SAAS;AAAA,IACZ,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IACrD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,IACjC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,IACnC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,IACxC,mBAAmB,EAChB,OAAO,EACP,MAAM,WAAW,EACjB,UAAU,CAAC,MAAM,CAA0B,EAC3C,SAAS;AAAA,IACZ,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,aAAa,EAAE,KAAK,CAAC,eAAe,YAAY,CAAC,EAAE,SAAS;AAAA,IAC5D,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,QAAQ,EAAE,KAAK,CAAC,OAAO,OAAO,SAAS,CAAC,EAAE,SAAS;AAAA,IACnD,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IACzB,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,IACpC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,IAChC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,IAClC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,CAAC;AAAA,EACD,YAAY,EACT;AAAA,IACC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAChC,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;AAAA,EACzE,EACC,OAAO,CAAC,SAAS,OAAO,KAAK,IAAI,EAAE,UAAU,EAAE,EAC/C,SAAS;AACd,CAAC,EACA,MAAM,EACN,IAAI,CAAC,EACL,IAAI,GAAG;AAEH,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC1C,YAAY,EACT;AAAA,IACC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAChC,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,EAClE,EACC,OAAO,CAAC,SAAS,OAAO,KAAK,IAAI,EAAE,UAAU,EAAE,EAC/C,SAAS;AACd,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,YAAY,EACT;AAAA,IACC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAChC,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;AAAA,EAClE,EACC,OAAO,CAAC,SAAS,OAAO,KAAK,IAAI,EAAE,UAAU,EAAE;AACpD,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import {\n optional,\n object,\n string,\n regex,\n number,\n boolean,\n null as _null,\n coerce,\n enum as _enum,\n trim,\n union,\n record,\n array,\n iso,\n minLength,\n maxLength,\n refine,\n pipe,\n transform,\n} from 'zod/v4-mini';\n\nconst items = array(\n record(\n string().check(trim(), minLength(1), maxLength(128)),\n union([string().check(maxLength(512)), number(), boolean(), _null()])\n )\n);\n\nexport const createTrackEventSchema = array(\n object({\n name: string().check(trim(), minLength(1), maxLength(64)),\n visitor_id: coerce.bigint(),\n timestamp: iso.datetime(),\n tags: object({\n os: optional(string()),\n os_name: optional(string()),\n os_version: optional(string()),\n browser: optional(string()),\n browser_name: optional(string()),\n browser_version: optional(string()),\n platform: optional(_enum(['ios', 'android', 'web', 'macos', 'windows', 'linux', 'unknown'])),\n device: optional(string()),\n device_id: optional(string().check(trim(), minLength(1), maxLength(36))),\n device_type: optional(string()),\n device_vendor: optional(string()),\n device_pixel_ratio: optional(string()),\n screen_resolution: optional(\n pipe(\n string().check(regex(/^\\d+x\\d+$/)),\n transform((v) => v as `${number}x${number}`)\n )\n ),\n release: optional(string()),\n language: optional(string()),\n time_zone: optional(string()),\n environment: optional(_enum(['development', 'production'])),\n source_url: optional(string()),\n source: optional(_enum(['web', 'app', 'offline'])),\n fbc: optional(string()),\n fbp: optional(string()),\n gclid: optional(string()),\n advertising_id: optional(string()),\n utm_source: optional(string()),\n utm_medium: optional(string()),\n utm_campaign: optional(string()),\n utm_term: optional(string()),\n utm_content: optional(string()),\n }),\n properties: optional(\n record(\n string().check(trim(), minLength(1), maxLength(128)),\n union([string().check(maxLength(512)), number(), boolean(), _null(), items])\n ).check(refine((data) => Object.keys(data).length <= 64))\n ),\n })\n).check(minLength(1), maxLength(100));\n\nexport const createVisitorSchema = object({\n device_id: string().check(trim(), minLength(1), maxLength(36)),\n properties: optional(\n record(\n string().check(trim(), minLength(1), maxLength(128)),\n union([string().check(maxLength(512)), number(), boolean(), _null()])\n ).check(refine((data) => Object.keys(data).length <= 64))\n ),\n});\n\nexport const updateVisitorSchema = object({\n properties: record(\n string().check(trim(), minLength(1), maxLength(128)),\n union([string().check(maxLength(512)), number(), boolean(), _null()])\n ).check(refine((data) => Object.keys(data).length <= 64)),\n});\n"],"mappings":"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","names":[]}
@@ -24,21 +24,16 @@ __export(track_exports, {
24
24
  trackAsync: () => trackAsync
25
25
  });
26
26
  module.exports = __toCommonJS(track_exports);
27
- var import_limiter = require("limiter");
27
+ var import_token_bucket = require("../utils/token-bucket.cjs");
28
28
  var import_setup = require("../setup/index.cjs");
29
29
  var import_visitor = require("../visitor/index.cjs");
30
30
  var defaultOptions = { enableThirdPartyTracking: true };
31
- var REQUEST_TOKENS = 2;
32
- var tokenBucket = new import_limiter.TokenBucket({
33
- bucketSize: 20,
34
- interval: "second",
35
- tokensPerInterval: 1
36
- });
31
+ var tokenBucket = new import_token_bucket.TokenBucket({ rate: 1, capacity: 20, requested: 2 });
37
32
  async function sendEvents(events) {
38
33
  var _a;
39
34
  try {
40
35
  if (events.length === 0) return;
41
- await tokenBucket.removeTokens(REQUEST_TOKENS);
36
+ await tokenBucket.removeTokens();
42
37
  const tags = await import_setup.config.getTags();
43
38
  const visitor_id = (await (0, import_visitor.getVisitor)()).id;
44
39
  const dto = events.map((event) => ({
@@ -1 +1 @@
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[number]) => 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\ntype Item = {\n name: TrackName<any>;\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens(REQUEST_TOKENS);\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n const headers = await config.getHeaders();\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto, { headers });\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log('Failed to send track event:', e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;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;AASD,eAAe,WAAW,QAAgB;AAjC1C;AAkCE,MAAI;AACF,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,YAAY,aAAa,cAAc;AAE7C,UAAM,OAAO,MAAM,oBAAO,QAAQ;AAClC,UAAM,cAAc,UAAM,2BAAW,GAAG;AACxC,UAAM,MAA2B,OAAO,IAAI,CAAC,WAAW;AAAA,MACtD,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,IACnB,EAAE;AACF,UAAM,UAAU,MAAM,oBAAO,WAAW;AACxC,UAAM,EAAE,KAAK,IAAI,MAAM,oBAAO,KAAK,KAAyB,WAAW,KAAK,EAAE,QAAQ,CAAC;AACvF,QAAI,QAAQ;AACZ,WAAO,OAAO,SAAS,GAAG;AACxB,YAAM,EAAE,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM;AACnD,YAAM,UAAU,KAAK,KAAK,EAAE;AAC5B,oBAAQ,cAAR,iCAAoB,EAAE,IAAI,QAAQ;AAClC;AACA,UAAI,CAAC,QAAQ,4BAA4B,CAAC,oBAAO,mBAAoB;AACrE,0BAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,CAAC;AAAA,IACnF;AAAA,EACF,SAAS,GAAY;AACnB,QAAI,aAAa,MAAO,SAAQ,IAAI,+BAA+B,EAAE,OAAO;AAC5E,WAAO,QAAQ,CAAC,UAAO;AA5D3B,UAAAA,KAAA;AA4D8B,oBAAAA,MAAA,MAAM,SAAQ,YAAd,wBAAAA,KAAwB;AAAA,KAAE;AAAA,EACtD;AACF;AAEA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAe,CAAC;AACtB,IAAI,QAA8C;AAE3C,SAAS,MACd,MACA,YACA,UAAwB,gBACxB;AACA,OAAK,KAAK,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC5E,MAAI,KAAK,UAAU,OAAO;AACxB,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AACf;AAAA,EACF;AACA,MAAI,MAAO,cAAa,KAAK;AAC7B,UAAQ,WAAW,MAAM;AACvB,YAAQ;AACR,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,KAAK;AACV;AAEA,eAAsB,WACpB,MACA,YACA,UAAwB,gBACxB;AACA,QAAM,WAAW,CAAC,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AACvF;","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from '../utils/token-bucket';\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[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n name: TrackName<any>;\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n const headers = await config.getHeaders();\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto, { headers });\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log('Failed to send track event:', e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA4B;AAC5B,mBAAuB;AACvB,qBAA2B;AAe3B,IAAM,iBAA+B,EAAE,0BAA0B,KAAK;AACtE,IAAM,cAAc,IAAI,gCAAY,EAAE,MAAM,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;AAS3E,eAAe,WAAW,QAAgB;AA3B1C;AA4BE,MAAI;AACF,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,YAAY,aAAa;AAE/B,UAAM,OAAO,MAAM,oBAAO,QAAQ;AAClC,UAAM,cAAc,UAAM,2BAAW,GAAG;AACxC,UAAM,MAA2B,OAAO,IAAI,CAAC,WAAW;AAAA,MACtD,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,IACnB,EAAE;AACF,UAAM,UAAU,MAAM,oBAAO,WAAW;AACxC,UAAM,EAAE,KAAK,IAAI,MAAM,oBAAO,KAAK,KAAyB,WAAW,KAAK,EAAE,QAAQ,CAAC;AACvF,QAAI,QAAQ;AACZ,WAAO,OAAO,SAAS,GAAG;AACxB,YAAM,EAAE,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM;AACnD,YAAM,UAAU,KAAK,KAAK,EAAE;AAC5B,oBAAQ,cAAR,iCAAoB,EAAE,IAAI,QAAQ;AAClC;AACA,UAAI,CAAC,QAAQ,4BAA4B,CAAC,oBAAO,mBAAoB;AACrE,0BAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,CAAC;AAAA,IACnF;AAAA,EACF,SAAS,GAAY;AACnB,QAAI,aAAa,MAAO,SAAQ,IAAI,+BAA+B,EAAE,OAAO;AAC5E,WAAO,QAAQ,CAAC,UAAO;AAtD3B,UAAAA,KAAA;AAsD8B,oBAAAA,MAAA,MAAM,SAAQ,YAAd,wBAAAA,KAAwB;AAAA,KAAE;AAAA,EACtD;AACF;AAEA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAe,CAAC;AACtB,IAAI,QAA8C;AAE3C,SAAS,MACd,MACA,YACA,UAAwB,gBACxB;AACA,OAAK,KAAK,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC5E,MAAI,KAAK,UAAU,OAAO;AACxB,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AACf;AAAA,EACF;AACA,MAAI,MAAO,cAAa,KAAK;AAC7B,UAAQ,WAAW,MAAM;AACvB,YAAQ;AACR,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,KAAK;AACV;AAEA,eAAsB,WACpB,MACA,YACA,UAAwB,gBACxB;AACA,QAAM,WAAW,CAAC,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AACvF;","names":["_a"]}
@@ -1,19 +1,14 @@
1
1
  // src/track/index.ts
2
- import { TokenBucket } from "limiter";
2
+ import { TokenBucket } from "../utils/token-bucket.mjs";
3
3
  import { config } from "../setup/index.mjs";
4
4
  import { getVisitor } from "../visitor/index.mjs";
5
5
  var defaultOptions = { enableThirdPartyTracking: true };
6
- var REQUEST_TOKENS = 2;
7
- var tokenBucket = new TokenBucket({
8
- bucketSize: 20,
9
- interval: "second",
10
- tokensPerInterval: 1
11
- });
6
+ var tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });
12
7
  async function sendEvents(events) {
13
8
  var _a;
14
9
  try {
15
10
  if (events.length === 0) return;
16
- await tokenBucket.removeTokens(REQUEST_TOKENS);
11
+ await tokenBucket.removeTokens();
17
12
  const tags = await config.getTags();
18
13
  const visitor_id = (await getVisitor()).id;
19
14
  const dto = events.map((event) => ({
@@ -1 +1 @@
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[number]) => 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\ntype Item = {\n name: TrackName<any>;\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens(REQUEST_TOKENS);\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n const headers = await config.getHeaders();\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto, { headers });\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log('Failed to send track event:', e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\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;AASD,eAAe,WAAW,QAAgB;AAjC1C;AAkCE,MAAI;AACF,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,YAAY,aAAa,cAAc;AAE7C,UAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,UAAM,cAAc,MAAM,WAAW,GAAG;AACxC,UAAM,MAA2B,OAAO,IAAI,CAAC,WAAW;AAAA,MACtD,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,IACnB,EAAE;AACF,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,KAAyB,WAAW,KAAK,EAAE,QAAQ,CAAC;AACvF,QAAI,QAAQ;AACZ,WAAO,OAAO,SAAS,GAAG;AACxB,YAAM,EAAE,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM;AACnD,YAAM,UAAU,KAAK,KAAK,EAAE;AAC5B,oBAAQ,cAAR,iCAAoB,EAAE,IAAI,QAAQ;AAClC;AACA,UAAI,CAAC,QAAQ,4BAA4B,CAAC,OAAO,mBAAoB;AACrE,aAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,CAAC;AAAA,IACnF;AAAA,EACF,SAAS,GAAY;AACnB,QAAI,aAAa,MAAO,SAAQ,IAAI,+BAA+B,EAAE,OAAO;AAC5E,WAAO,QAAQ,CAAC,UAAO;AA5D3B,UAAAA,KAAA;AA4D8B,oBAAAA,MAAA,MAAM,SAAQ,YAAd,wBAAAA,KAAwB;AAAA,KAAE;AAAA,EACtD;AACF;AAEA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAe,CAAC;AACtB,IAAI,QAA8C;AAE3C,SAAS,MACd,MACA,YACA,UAAwB,gBACxB;AACA,OAAK,KAAK,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC5E,MAAI,KAAK,UAAU,OAAO;AACxB,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AACf;AAAA,EACF;AACA,MAAI,MAAO,cAAa,KAAK;AAC7B,UAAQ,WAAW,MAAM;AACvB,YAAQ;AACR,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,KAAK;AACV;AAEA,eAAsB,WACpB,MACA,YACA,UAAwB,gBACxB;AACA,QAAM,WAAW,CAAC,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AACvF;","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { TokenBucket } from '../utils/token-bucket';\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[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n name: TrackName<any>;\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n const headers = await config.getHeaders();\n const { data } = await config.http.post<TrackEventResponse>(`/events`, dto, { headers });\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log('Failed to send track event:', e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,cAAc;AACvB,SAAS,kBAAkB;AAe3B,IAAM,iBAA+B,EAAE,0BAA0B,KAAK;AACtE,IAAM,cAAc,IAAI,YAAY,EAAE,MAAM,GAAG,UAAU,IAAI,WAAW,EAAE,CAAC;AAS3E,eAAe,WAAW,QAAgB;AA3B1C;AA4BE,MAAI;AACF,QAAI,OAAO,WAAW,EAAG;AACzB,UAAM,YAAY,aAAa;AAE/B,UAAM,OAAO,MAAM,OAAO,QAAQ;AAClC,UAAM,cAAc,MAAM,WAAW,GAAG;AACxC,UAAM,MAA2B,OAAO,IAAI,CAAC,WAAW;AAAA,MACtD,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,IACnB,EAAE;AACF,UAAM,UAAU,MAAM,OAAO,WAAW;AACxC,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,KAAK,KAAyB,WAAW,KAAK,EAAE,QAAQ,CAAC;AACvF,QAAI,QAAQ;AACZ,WAAO,OAAO,SAAS,GAAG;AACxB,YAAM,EAAE,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM;AACnD,YAAM,UAAU,KAAK,KAAK,EAAE;AAC5B,oBAAQ,cAAR,iCAAoB,EAAE,IAAI,QAAQ;AAClC;AACA,UAAI,CAAC,QAAQ,4BAA4B,CAAC,OAAO,mBAAoB;AACrE,aAAO,mBAAmB,QAAQ,CAAC,YAAY,QAAQ,MAAM,YAAY,OAAO,CAAC;AAAA,IACnF;AAAA,EACF,SAAS,GAAY;AACnB,QAAI,aAAa,MAAO,SAAQ,IAAI,+BAA+B,EAAE,OAAO;AAC5E,WAAO,QAAQ,CAAC,UAAO;AAtD3B,UAAAA,KAAA;AAsD8B,oBAAAA,MAAA,MAAM,SAAQ,YAAd,wBAAAA,KAAwB;AAAA,KAAE;AAAA,EACtD;AACF;AAEA,IAAM,QAAQ;AACd,IAAM,QAAQ;AACd,IAAM,OAAe,CAAC;AACtB,IAAI,QAA8C;AAE3C,SAAS,MACd,MACA,YACA,UAAwB,gBACxB;AACA,OAAK,KAAK,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAC5E,MAAI,KAAK,UAAU,OAAO;AACxB,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AACf;AAAA,EACF;AACA,MAAI,MAAO,cAAa,KAAK;AAC7B,UAAQ,WAAW,MAAM;AACvB,YAAQ;AACR,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,SAAS;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,KAAK;AACV;AAEA,eAAsB,WACpB,MACA,YACA,UAAwB,gBACxB;AACA,QAAM,WAAW,CAAC,EAAE,MAAM,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AACvF;","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/types.ts"],"sourcesContent":["import type { StandardEvents, UserProvidedData as GAUserProvidedData } 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 = EventName> = T extends keyof StandardEvents\n ? T\n : EventName;\nexport type TrackProperties<T extends EventName = 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 interface UserProvidedData extends GAUserProvidedData {\n user_id?: string;\n ip_address?: string;\n user_agent?: string;\n gender?: 'female' | 'male';\n birthday?: { year: number; month: number; day: number };\n // meta specific\n fb_login_id?: string;\n fb_page_id?: 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_model_id?: string;\n device_pixel_ratio?: string;\n screen_width?: number;\n screen_height?: number;\n screen_resolution?: `${number}x${number}`;\n}\n\nexport interface AppInfo {\n install_referrer?: string;\n}\n\nexport interface EnvironmentInfo {\n release?: string;\n language?: string;\n time_zone?: string | null;\n environment?: 'development' | 'production';\n}\n\nexport interface SourceInfo {\n source_url?: string;\n source?: 'app' | 'web' | 'offline';\n}\n\nexport interface AdvertisingInfo {\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 /** iOS: IDFA, Android: Android Advertising ID */\n advertising_id?: 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 AppInfo,\n EnvironmentInfo,\n SourceInfo,\n AdvertisingInfo,\n UTMParams {\n idempotency_key?: string;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport type CreateTrackEventDTO<T extends EventName = EventName> = {\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string;\n properties?: TrackProperties<T>;\n timestamp: string;\n}[];\n\nexport interface TrackEvent<T extends EventName = EventName> {\n id: string | bigint;\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string | bigint;\n properties?: TrackProperties<T>;\n created_at: string;\n}\n\nexport type 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":[]}
1
+ {"version":3,"sources":["../../src/track/types.ts"],"sourcesContent":["import type { StandardEvents, UserProvidedData as GAUserProvidedData } from './gtag';\n\nexport type AllowedPropertyValues = string | number | boolean | null;\nexport type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'INP' | 'LCP' | 'TTFB';\n\nexport type TrackName<T extends EventName = EventName> = T extends keyof StandardEvents\n ? T\n : EventName;\nexport type TrackProperties<T extends EventName = 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 interface UserProvidedData extends GAUserProvidedData {\n user_id?: string;\n ip_address?: string;\n user_agent?: string;\n gender?: 'female' | 'male';\n birthday?: { year: number; month: number; day: number };\n // meta specific\n fb_login_id?: string;\n fb_page_id?: 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_model_id?: string;\n device_pixel_ratio?: string;\n screen_width?: number;\n screen_height?: number;\n screen_resolution?: `${number}x${number}`;\n}\n\nexport interface AppInfo {\n install_referrer?: string;\n}\n\nexport interface EnvironmentInfo {\n release?: string;\n language?: string;\n time_zone?: string | null;\n environment?: 'development' | 'production';\n}\n\nexport interface SourceInfo {\n source_url?: string;\n source?: 'app' | 'web' | 'offline';\n}\n\nexport interface AdvertisingInfo {\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 /** iOS: IDFA, Android: Android Advertising ID */\n advertising_id?: 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 AppInfo,\n EnvironmentInfo,\n SourceInfo,\n AdvertisingInfo,\n UTMParams {\n idempotency_key?: string;\n [key: string]: string | number | boolean | null | undefined;\n}\n\nexport type CreateTrackEventDTO<T extends EventName = EventName> = {\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string;\n properties?: TrackProperties<T>;\n timestamp: string;\n}[];\n\nexport interface TrackEvent<T extends EventName = EventName> {\n id: string | bigint;\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string | bigint;\n properties?: TrackProperties<T>;\n created_at: string;\n}\n\nexport type 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":[]}
@@ -1,7 +1,7 @@
1
1
  import { StandardEvents, UserProvidedData as UserProvidedData$1 } from './gtag.cjs';
2
2
 
3
3
  type AllowedPropertyValues = string | number | boolean | null;
4
- type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'FID' | 'INP' | 'LCP' | 'TTFB';
4
+ type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'INP' | 'LCP' | 'TTFB';
5
5
  type TrackName<T extends EventName = EventName> = T extends keyof StandardEvents ? T : EventName;
6
6
  type TrackProperties<T extends EventName = EventName> = T extends keyof StandardEvents ? StandardEvents[T] : Record<Lowercase<string>, AllowedPropertyValues>;
7
7
  interface UserData {
@@ -1,7 +1,7 @@
1
1
  import { StandardEvents, UserProvidedData as UserProvidedData$1 } from './gtag.js';
2
2
 
3
3
  type AllowedPropertyValues = string | number | boolean | null;
4
- type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'FID' | 'INP' | 'LCP' | 'TTFB';
4
+ type EventName = Lowercase<string> | 'CLS' | 'FCP' | 'INP' | 'LCP' | 'TTFB';
5
5
  type TrackName<T extends EventName = EventName> = T extends keyof StandardEvents ? T : EventName;
6
6
  type TrackProperties<T extends EventName = EventName> = T extends keyof StandardEvents ? StandardEvents[T] : Record<Lowercase<string>, AllowedPropertyValues>;
7
7
  interface UserData {