@shware/analytics 2.15.5 → 2.16.1

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.
@@ -29,31 +29,16 @@ var items = array(
29
29
  union([string().check(maxLength(512)), number(), boolean(), _null()])
30
30
  )
31
31
  );
32
- var Platform = /* @__PURE__ */ ((Platform2) => {
33
- Platform2["ios"] = "ios";
34
- Platform2["android"] = "android";
35
- Platform2["web"] = "web";
36
- Platform2["macos"] = "macos";
37
- Platform2["windows"] = "windows";
38
- Platform2["linux"] = "linux";
39
- Platform2["unknown"] = "unknown";
40
- return Platform2;
41
- })(Platform || {});
42
- var Environment = /* @__PURE__ */ ((Environment2) => {
43
- Environment2["development"] = "development";
44
- Environment2["production"] = "production";
45
- return Environment2;
46
- })(Environment || {});
47
32
  var ALL_PLATFORMS = [
48
- "ios" /* ios */,
49
- "android" /* android */,
50
- "web" /* web */,
51
- "macos" /* macos */,
52
- "windows" /* windows */,
53
- "linux" /* linux */,
54
- "unknown" /* unknown */
33
+ "ios",
34
+ "android",
35
+ "web",
36
+ "macos",
37
+ "windows",
38
+ "linux",
39
+ "unknown"
55
40
  ];
56
- var ALL_ENVIRONMENTS = ["development" /* development */, "production" /* production */];
41
+ var ALL_ENVIRONMENTS = ["development", "production"];
57
42
  var tagsSchema = object({
58
43
  os: optional(string()),
59
44
  os_name: optional(string()),
@@ -61,7 +46,7 @@ var tagsSchema = object({
61
46
  browser: optional(string()),
62
47
  browser_name: optional(string()),
63
48
  browser_version: optional(string()),
64
- platform: _enum(Platform),
49
+ platform: _enum(ALL_PLATFORMS),
65
50
  device: optional(string()),
66
51
  device_id: optional(string().check(trim(), minLength(1), maxLength(36))),
67
52
  device_type: optional(string()),
@@ -78,7 +63,7 @@ var tagsSchema = object({
78
63
  release: optional(string()),
79
64
  language: optional(string()),
80
65
  time_zone: optional(string()),
81
- environment: _enum(Environment),
66
+ environment: _enum(ALL_ENVIRONMENTS),
82
67
  source_url: optional(string()),
83
68
  source: optional(_enum(["web", "app", "offline"])),
84
69
  // app info
@@ -136,6 +121,8 @@ var createTrackEventSchemaV1 = array(
136
121
  name: string().check(trim(), minLength(1), maxLength(64)),
137
122
  visitor_id: coerce.bigint(),
138
123
  session_id: uuid(),
124
+ platform: _enum(ALL_PLATFORMS),
125
+ environment: _enum(ALL_ENVIRONMENTS),
139
126
  timestamp: iso.datetime(),
140
127
  tags: tagsSchema,
141
128
  properties: propertiesSchema
@@ -146,6 +133,8 @@ var createTrackEventSchema = array(
146
133
  name: string().check(trim(), minLength(1), maxLength(64)),
147
134
  visitor_id: uuid(),
148
135
  session_id: uuid(),
136
+ platform: _enum(ALL_PLATFORMS),
137
+ environment: _enum(ALL_ENVIRONMENTS),
149
138
  timestamp: iso.datetime(),
150
139
  tags: tagsSchema,
151
140
  properties: propertiesSchema
@@ -153,6 +142,8 @@ var createTrackEventSchema = array(
153
142
  ).check(minLength(1), maxLength(100));
154
143
  var createVisitorSchema = object({
155
144
  device_id: string().check(trim(), minLength(1), maxLength(36)),
145
+ platform: _enum(ALL_PLATFORMS),
146
+ environment: _enum(ALL_ENVIRONMENTS),
156
147
  properties: optional(
157
148
  record(
158
149
  string().check(trim(), minLength(1), maxLength(128)),
@@ -225,8 +216,6 @@ var createLinkSchema = object({
225
216
  export {
226
217
  ALL_ENVIRONMENTS,
227
218
  ALL_PLATFORMS,
228
- Environment,
229
- Platform,
230
219
  createFeedbackSchema,
231
220
  createLinkSchema,
232
221
  createTrackEventSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import {\n enum as _enum,\n null as _null,\n array,\n boolean,\n coerce,\n email,\n iso,\n maxLength,\n minLength,\n number,\n object,\n optional,\n pipe,\n record,\n refine,\n regex,\n string,\n transform,\n trim,\n union,\n url,\n uuid,\n type z,\n} from 'zod/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 enum Platform {\n ios = 'ios',\n android = 'android',\n web = 'web',\n macos = 'macos',\n windows = 'windows',\n linux = 'linux',\n unknown = 'unknown',\n}\n\nexport enum Environment {\n development = 'development',\n production = 'production',\n}\n\nexport const ALL_PLATFORMS = [\n Platform.ios,\n Platform.android,\n Platform.web,\n Platform.macos,\n Platform.windows,\n Platform.linux,\n Platform.unknown,\n] as const;\n\nexport const ALL_ENVIRONMENTS = [Environment.development, Environment.production] as const;\n\nexport const tagsSchema = 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: _enum(Platform),\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(number()),\n screen_width: optional(number()),\n screen_height: optional(number()),\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: _enum(Environment),\n source_url: optional(string()),\n source: optional(_enum(['web', 'app', 'offline'])),\n // app info\n advertising_id: optional(string()),\n install_referrer: optional(string()),\n // meta ads\n fbc: optional(string()),\n fbp: optional(string()),\n fbclid: optional(string()),\n ad_id: optional(string()),\n ad_name: optional(string()),\n adset_id: optional(string()),\n adset_name: optional(string()),\n campaign_id: optional(string()),\n campaign_name: optional(string()),\n placement: optional(string()),\n site_source_name: optional(string()),\n // google ads\n gclid: optional(string()),\n gclsrc: optional(string()),\n gad_source: optional(string()),\n gad_campaignid: optional(string()),\n // reddit ads\n rdt_cid: optional(string()),\n rdt_uuid: optional(string()),\n // click ids\n dclid: optional(string()),\n ko_click_id: optional(string()),\n li_fat_id: optional(string()),\n msclkid: optional(string()),\n sccid: optional(string()),\n ttclid: optional(string()),\n twclid: optional(string()),\n wbraid: optional(string()),\n yclid: optional(string()),\n // utm params\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 utm_id: optional(string()),\n utm_source_platform: optional(string()),\n utm_creative_format: optional(string()),\n utm_marketing_tactic: optional(string()),\n});\n\nexport const propertiesSchema = 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/** @deprecated */\nexport const createTrackEventSchemaV1 = array(\n object({\n name: string().check(trim(), minLength(1), maxLength(64)),\n visitor_id: coerce.bigint(),\n session_id: uuid(),\n timestamp: iso.datetime(),\n tags: tagsSchema,\n properties: propertiesSchema,\n })\n).check(minLength(1), maxLength(100));\n\nexport const createTrackEventSchema = array(\n object({\n name: string().check(trim(), minLength(1), maxLength(64)),\n visitor_id: uuid(),\n session_id: uuid(),\n timestamp: iso.datetime(),\n tags: tagsSchema,\n properties: propertiesSchema,\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 user_id: optional(uuid()),\n distinct_id: optional(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 createFeedbackSchema = object({\n name: string().check(minLength(1), maxLength(256)),\n email: email().check(maxLength(320)),\n message: string().check(minLength(1), maxLength(65536)),\n});\n\nconst noEmptyString = pipe(\n string().check(maxLength(256)),\n transform((v) => (v ? v : undefined))\n);\n\n/**\n * The schema for creating a link.\n * @see https://support.google.com/analytics/answer/10917952\n * */\nexport const createLinkSchema = object({\n /** The URL that the user is redirected to. */\n url: url().check(minLength(1), maxLength(1024)), // required\n\n /**\n * Campaign ID. Used to identify a specific campaign or promotion. This is a required key for GA4\n * data import. Use the same IDs that you use when uploading campaign cost data.\n */\n utm_id: optional(noEmptyString),\n\n /** Referrer, for example: google, newsletter4, billboard */\n utm_source: string().check(minLength(1), maxLength(256)), // required\n\n /** Marketing medium, for example: cpc, banner, email */\n utm_medium: string().check(minLength(1), maxLength(256)), // required\n\n /** Product, slogan, promo code, for example: spring_sale */\n utm_campaign: string().check(minLength(1), maxLength(256)), // required\n\n /** Paid keyword */\n utm_term: optional(noEmptyString),\n\n /**\n * Use to differentiate creatives. For example, if you have two call-to-action links within the\n * same email message, you can use utm_content and set different values for each so you can tell\n * which version is more effective.\n */\n utm_content: optional(noEmptyString),\n\n /**\n * The platform responsible for directing traffic to a given Analytics property (such as a buying\n * platform that sets budgets and targeting criteria or a platform that manages organic traffic\n * data). For example: Search Ads 360 or Display & Video 360.\n */\n utm_source_platform: optional(noEmptyString),\n\n /**\n * Type of creative, for example: display, native, video, search, utm_creative_format is not\n * currently reported in Google Analytics 4 properties.\n */\n utm_creative_format: optional(noEmptyString),\n\n /**\n * Targeting criteria applied to a campaign, for example: remarketing, prospecting,\n * utm_marketing_tactic is not currently reported in Google Analytics 4 properties.\n * */\n utm_marketing_tactic: optional(noEmptyString),\n});\n\nexport type CreateFeedbackDTO = z.output<typeof createFeedbackSchema>;\nexport type CreateLinkDTO = z.output<typeof createLinkSchema>;\n"],"mappings":"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","names":["Platform","Environment"]}
1
+ {"version":3,"sources":["../../src/schema/index.ts"],"sourcesContent":["import {\n enum as _enum,\n null as _null,\n array,\n boolean,\n coerce,\n email,\n iso,\n maxLength,\n minLength,\n number,\n object,\n optional,\n pipe,\n record,\n refine,\n regex,\n string,\n transform,\n trim,\n union,\n url,\n uuid,\n type z,\n} from 'zod/mini';\nimport type { Environment, Platform } from '../track/types';\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 ALL_PLATFORMS = [\n 'ios',\n 'android',\n 'web',\n 'macos',\n 'windows',\n 'linux',\n 'unknown',\n] as const satisfies Platform[];\n\nexport const ALL_ENVIRONMENTS = ['development', 'production'] as const satisfies Environment[];\n\nexport const tagsSchema = 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: _enum(ALL_PLATFORMS),\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(number()),\n screen_width: optional(number()),\n screen_height: optional(number()),\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: _enum(ALL_ENVIRONMENTS),\n source_url: optional(string()),\n source: optional(_enum(['web', 'app', 'offline'])),\n // app info\n advertising_id: optional(string()),\n install_referrer: optional(string()),\n // meta ads\n fbc: optional(string()),\n fbp: optional(string()),\n fbclid: optional(string()),\n ad_id: optional(string()),\n ad_name: optional(string()),\n adset_id: optional(string()),\n adset_name: optional(string()),\n campaign_id: optional(string()),\n campaign_name: optional(string()),\n placement: optional(string()),\n site_source_name: optional(string()),\n // google ads\n gclid: optional(string()),\n gclsrc: optional(string()),\n gad_source: optional(string()),\n gad_campaignid: optional(string()),\n // reddit ads\n rdt_cid: optional(string()),\n rdt_uuid: optional(string()),\n // click ids\n dclid: optional(string()),\n ko_click_id: optional(string()),\n li_fat_id: optional(string()),\n msclkid: optional(string()),\n sccid: optional(string()),\n ttclid: optional(string()),\n twclid: optional(string()),\n wbraid: optional(string()),\n yclid: optional(string()),\n // utm params\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 utm_id: optional(string()),\n utm_source_platform: optional(string()),\n utm_creative_format: optional(string()),\n utm_marketing_tactic: optional(string()),\n});\n\nexport const propertiesSchema = 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/** @deprecated */\nexport const createTrackEventSchemaV1 = array(\n object({\n name: string().check(trim(), minLength(1), maxLength(64)),\n visitor_id: coerce.bigint(),\n session_id: uuid(),\n platform: _enum(ALL_PLATFORMS),\n environment: _enum(ALL_ENVIRONMENTS),\n timestamp: iso.datetime(),\n tags: tagsSchema,\n properties: propertiesSchema,\n })\n).check(minLength(1), maxLength(100));\n\nexport const createTrackEventSchema = array(\n object({\n name: string().check(trim(), minLength(1), maxLength(64)),\n visitor_id: uuid(),\n session_id: uuid(),\n platform: _enum(ALL_PLATFORMS),\n environment: _enum(ALL_ENVIRONMENTS),\n timestamp: iso.datetime(),\n tags: tagsSchema,\n properties: propertiesSchema,\n })\n).check(minLength(1), maxLength(100));\n\nexport const createVisitorSchema = object({\n device_id: string().check(trim(), minLength(1), maxLength(36)),\n platform: _enum(ALL_PLATFORMS),\n environment: _enum(ALL_ENVIRONMENTS),\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 user_id: optional(uuid()),\n distinct_id: optional(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 createFeedbackSchema = object({\n name: string().check(minLength(1), maxLength(256)),\n email: email().check(maxLength(320)),\n message: string().check(minLength(1), maxLength(65536)),\n});\n\nconst noEmptyString = pipe(\n string().check(maxLength(256)),\n transform((v) => (v ? v : undefined))\n);\n\n/**\n * The schema for creating a link.\n * @see https://support.google.com/analytics/answer/10917952\n * */\nexport const createLinkSchema = object({\n /** The URL that the user is redirected to. */\n url: url().check(minLength(1), maxLength(1024)), // required\n\n /**\n * Campaign ID. Used to identify a specific campaign or promotion. This is a required key for GA4\n * data import. Use the same IDs that you use when uploading campaign cost data.\n */\n utm_id: optional(noEmptyString),\n\n /** Referrer, for example: google, newsletter4, billboard */\n utm_source: string().check(minLength(1), maxLength(256)), // required\n\n /** Marketing medium, for example: cpc, banner, email */\n utm_medium: string().check(minLength(1), maxLength(256)), // required\n\n /** Product, slogan, promo code, for example: spring_sale */\n utm_campaign: string().check(minLength(1), maxLength(256)), // required\n\n /** Paid keyword */\n utm_term: optional(noEmptyString),\n\n /**\n * Use to differentiate creatives. For example, if you have two call-to-action links within the\n * same email message, you can use utm_content and set different values for each so you can tell\n * which version is more effective.\n */\n utm_content: optional(noEmptyString),\n\n /**\n * The platform responsible for directing traffic to a given Analytics property (such as a buying\n * platform that sets budgets and targeting criteria or a platform that manages organic traffic\n * data). For example: Search Ads 360 or Display & Video 360.\n */\n utm_source_platform: optional(noEmptyString),\n\n /**\n * Type of creative, for example: display, native, video, search, utm_creative_format is not\n * currently reported in Google Analytics 4 properties.\n */\n utm_creative_format: optional(noEmptyString),\n\n /**\n * Targeting criteria applied to a campaign, for example: remarketing, prospecting,\n * utm_marketing_tactic is not currently reported in Google Analytics 4 properties.\n * */\n utm_marketing_tactic: optional(noEmptyString),\n});\n\nexport type CreateTrackEventDTO = z.output<typeof createTrackEventSchema>;\nexport type CreateFeedbackDTO = z.output<typeof createFeedbackSchema>;\nexport type CreateLinkDTO = z.output<typeof createLinkSchema>;\nexport type CreateVisitorDTO = z.output<typeof createVisitorSchema>;\nexport type UpdateVisitorDTO = z.output<typeof updateVisitorSchema>;\n"],"mappings":"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","names":[]}
@@ -33,6 +33,8 @@ var config = {
33
33
  endpoint: "",
34
34
  release: "0.0.0",
35
35
  storage: null,
36
+ platform: null,
37
+ environment: null,
36
38
  getTags: null,
37
39
  getDeviceId: null,
38
40
  getHeaders: null,
@@ -42,6 +44,8 @@ var config = {
42
44
  function setupAnalytics(init) {
43
45
  config.release = init.release;
44
46
  config.storage = init.storage;
47
+ config.platform = init.platform;
48
+ config.environment = init.environment;
45
49
  config.endpoint = init.endpoint.endsWith("/") ? init.endpoint.slice(0, -1) : init.endpoint;
46
50
  config.getTags = init.getTags;
47
51
  config.getDeviceId = init.getDeviceId;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import type { ThirdPartyTracker, TrackTags } from '../track/types';\nimport type { ThirdPartyUserSetter, Visitor } from '../visitor/types';\n\nexport interface Storage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n endpoint: string;\n storage: Storage;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\ninterface Cache {\n tags: TrackTags | null;\n visitor: Visitor | null;\n}\n\nexport const cache: Cache = {\n tags: null,\n visitor: null,\n};\n\nexport const config: Config = {\n endpoint: '',\n release: '0.0.0',\n storage: null!,\n getTags: null!,\n getDeviceId: null!,\n getHeaders: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.endpoint = init.endpoint.endsWith('/') ? init.endpoint.slice(0, -1) : init.endpoint;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.getHeaders = async () => ({\n 'Content-Type': 'application/json',\n ...(await init.getHeaders?.()),\n });\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCO,IAAM,QAAe;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,SAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,WAAW,KAAK,SAAS,SAAS,GAAG,IAAI,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAClF,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,aAAa,YAAS;AAzD/B;AAyDmC;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAI,QAAM,UAAK,eAAL;AAAA,IACZ;AAAA;AACA,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAChE;","names":[]}
1
+ {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import type { Environment, Platform, ThirdPartyTracker, TrackTags } from '../track/types';\nimport type { ThirdPartyUserSetter, Visitor } from '../visitor/types';\n\nexport interface Storage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n platform: Platform;\n environment: Environment;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n endpoint: string;\n storage: Storage;\n platform: Platform;\n environment: Environment;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\ninterface Cache {\n tags: TrackTags | null;\n visitor: Visitor | null;\n}\n\nexport const cache: Cache = {\n tags: null,\n visitor: null,\n};\n\nexport const config: Config = {\n endpoint: '',\n release: '0.0.0',\n storage: null!,\n platform: null!,\n environment: null!,\n getTags: null!,\n getDeviceId: null!,\n getHeaders: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.platform = init.platform;\n config.environment = init.environment;\n config.endpoint = init.endpoint.endsWith('/') ? init.endpoint.slice(0, -1) : init.endpoint;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.getHeaders = async () => ({\n 'Content-Type': 'application/json',\n ...(await init.getHeaders?.()),\n });\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCO,IAAM,QAAe;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,SAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,WAAW,KAAK;AACvB,SAAO,cAAc,KAAK;AAC1B,SAAO,WAAW,KAAK,SAAS,SAAS,GAAG,IAAI,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAClF,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,aAAa,YAAS;AAjE/B;AAiEmC;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAI,QAAM,UAAK,eAAL;AAAA,IACZ;AAAA;AACA,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAChE;","names":[]}
@@ -1,4 +1,4 @@
1
- import { TrackTags, ThirdPartyTracker } from '../track/types.cjs';
1
+ import { Platform, Environment, TrackTags, ThirdPartyTracker } from '../track/types.cjs';
2
2
  import { ThirdPartyUserSetter, Visitor } from '../visitor/types.cjs';
3
3
  import '../track/gtag.cjs';
4
4
 
@@ -10,6 +10,8 @@ interface Options {
10
10
  release: string;
11
11
  storage: Storage;
12
12
  endpoint: string;
13
+ platform: Platform;
14
+ environment: Environment;
13
15
  getTags: () => TrackTags | Promise<TrackTags>;
14
16
  getDeviceId: () => string | Promise<string>;
15
17
  getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
@@ -20,6 +22,8 @@ interface Config {
20
22
  release: string;
21
23
  endpoint: string;
22
24
  storage: Storage;
25
+ platform: Platform;
26
+ environment: Environment;
23
27
  getTags: () => TrackTags | Promise<TrackTags>;
24
28
  getDeviceId: () => string | Promise<string>;
25
29
  getHeaders: () => Record<string, string> | Promise<Record<string, string>>;
@@ -1,4 +1,4 @@
1
- import { TrackTags, ThirdPartyTracker } from '../track/types.js';
1
+ import { Platform, Environment, TrackTags, ThirdPartyTracker } from '../track/types.js';
2
2
  import { ThirdPartyUserSetter, Visitor } from '../visitor/types.js';
3
3
  import '../track/gtag.js';
4
4
 
@@ -10,6 +10,8 @@ interface Options {
10
10
  release: string;
11
11
  storage: Storage;
12
12
  endpoint: string;
13
+ platform: Platform;
14
+ environment: Environment;
13
15
  getTags: () => TrackTags | Promise<TrackTags>;
14
16
  getDeviceId: () => string | Promise<string>;
15
17
  getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;
@@ -20,6 +22,8 @@ interface Config {
20
22
  release: string;
21
23
  endpoint: string;
22
24
  storage: Storage;
25
+ platform: Platform;
26
+ environment: Environment;
23
27
  getTags: () => TrackTags | Promise<TrackTags>;
24
28
  getDeviceId: () => string | Promise<string>;
25
29
  getHeaders: () => Record<string, string> | Promise<Record<string, string>>;
@@ -7,6 +7,8 @@ var config = {
7
7
  endpoint: "",
8
8
  release: "0.0.0",
9
9
  storage: null,
10
+ platform: null,
11
+ environment: null,
10
12
  getTags: null,
11
13
  getDeviceId: null,
12
14
  getHeaders: null,
@@ -16,6 +18,8 @@ var config = {
16
18
  function setupAnalytics(init) {
17
19
  config.release = init.release;
18
20
  config.storage = init.storage;
21
+ config.platform = init.platform;
22
+ config.environment = init.environment;
19
23
  config.endpoint = init.endpoint.endsWith("/") ? init.endpoint.slice(0, -1) : init.endpoint;
20
24
  config.getTags = init.getTags;
21
25
  config.getDeviceId = init.getDeviceId;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import type { ThirdPartyTracker, TrackTags } from '../track/types';\nimport type { ThirdPartyUserSetter, Visitor } from '../visitor/types';\n\nexport interface Storage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n endpoint: string;\n storage: Storage;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\ninterface Cache {\n tags: TrackTags | null;\n visitor: Visitor | null;\n}\n\nexport const cache: Cache = {\n tags: null,\n visitor: null,\n};\n\nexport const config: Config = {\n endpoint: '',\n release: '0.0.0',\n storage: null!,\n getTags: null!,\n getDeviceId: null!,\n getHeaders: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.endpoint = init.endpoint.endsWith('/') ? init.endpoint.slice(0, -1) : init.endpoint;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.getHeaders = async () => ({\n 'Content-Type': 'application/json',\n ...(await init.getHeaders?.()),\n });\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n}\n"],"mappings":";AAmCO,IAAM,QAAe;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,SAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,WAAW,KAAK,SAAS,SAAS,GAAG,IAAI,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAClF,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,aAAa,YAAS;AAzD/B;AAyDmC;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAI,QAAM,UAAK,eAAL;AAAA,IACZ;AAAA;AACA,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAChE;","names":[]}
1
+ {"version":3,"sources":["../../src/setup/index.ts"],"sourcesContent":["import type { Environment, Platform, ThirdPartyTracker, TrackTags } from '../track/types';\nimport type { ThirdPartyUserSetter, Visitor } from '../visitor/types';\n\nexport interface Storage {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n}\n\nexport interface Options {\n release: string;\n storage: Storage;\n endpoint: string;\n platform: Platform;\n environment: Environment;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers?: ThirdPartyTracker[];\n thirdPartyUserSetters?: ThirdPartyUserSetter[];\n}\n\ninterface Config {\n release: string;\n endpoint: string;\n storage: Storage;\n platform: Platform;\n environment: Environment;\n getTags: () => TrackTags | Promise<TrackTags>;\n getDeviceId: () => string | Promise<string>;\n getHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n thirdPartyTrackers: ThirdPartyTracker[];\n thirdPartyUserSetters: ThirdPartyUserSetter[];\n}\n\ninterface Cache {\n tags: TrackTags | null;\n visitor: Visitor | null;\n}\n\nexport const cache: Cache = {\n tags: null,\n visitor: null,\n};\n\nexport const config: Config = {\n endpoint: '',\n release: '0.0.0',\n storage: null!,\n platform: null!,\n environment: null!,\n getTags: null!,\n getDeviceId: null!,\n getHeaders: null!,\n thirdPartyTrackers: [],\n thirdPartyUserSetters: [],\n};\n\nexport function setupAnalytics(init: Options) {\n config.release = init.release;\n config.storage = init.storage;\n config.platform = init.platform;\n config.environment = init.environment;\n config.endpoint = init.endpoint.endsWith('/') ? init.endpoint.slice(0, -1) : init.endpoint;\n config.getTags = init.getTags;\n config.getDeviceId = init.getDeviceId;\n config.getHeaders = async () => ({\n 'Content-Type': 'application/json',\n ...(await init.getHeaders?.()),\n });\n config.thirdPartyTrackers = init.thirdPartyTrackers ?? [];\n config.thirdPartyUserSetters = init.thirdPartyUserSetters ?? [];\n}\n"],"mappings":";AAuCO,IAAM,QAAe;AAAA,EAC1B,MAAM;AAAA,EACN,SAAS;AACX;AAEO,IAAM,SAAiB;AAAA,EAC5B,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,oBAAoB,CAAC;AAAA,EACrB,uBAAuB,CAAC;AAC1B;AAEO,SAAS,eAAe,MAAe;AAC5C,SAAO,UAAU,KAAK;AACtB,SAAO,UAAU,KAAK;AACtB,SAAO,WAAW,KAAK;AACvB,SAAO,cAAc,KAAK;AAC1B,SAAO,WAAW,KAAK,SAAS,SAAS,GAAG,IAAI,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAClF,SAAO,UAAU,KAAK;AACtB,SAAO,cAAc,KAAK;AAC1B,SAAO,aAAa,YAAS;AAjE/B;AAiEmC;AAAA,MAC/B,gBAAgB;AAAA,MAChB,GAAI,QAAM,UAAK,eAAL;AAAA,IACZ;AAAA;AACA,SAAO,qBAAqB,KAAK,sBAAsB,CAAC;AACxD,SAAO,wBAAwB,KAAK,yBAAyB,CAAC;AAChE;","names":[]}
@@ -57,6 +57,8 @@ async function sendEvents(events) {
57
57
  tags,
58
58
  visitor_id,
59
59
  session_id: session.id,
60
+ platform: import_setup.config.platform,
61
+ environment: import_setup.config.environment,
60
62
  timestamp: event.timestamp
61
63
  }));
62
64
  const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/events`, {
@@ -120,6 +122,8 @@ function sendBeacon(name, properties) {
120
122
  tags: import_setup.cache.tags,
121
123
  visitor_id: import_setup.cache.visitor.id,
122
124
  session_id: session.id,
125
+ platform: import_setup.config.platform,
126
+ environment: import_setup.config.environment,
123
127
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
124
128
  }
125
129
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\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(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\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\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(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\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
@@ -36,6 +36,8 @@ async function sendEvents(events) {
36
36
  tags,
37
37
  visitor_id,
38
38
  session_id: session.id,
39
+ platform: config.platform,
40
+ environment: config.environment,
39
41
  timestamp: event.timestamp
40
42
  }));
41
43
  const response = await fetch(`${config.endpoint}/events`, {
@@ -99,6 +101,8 @@ function sendBeacon(name, properties) {
99
101
  tags: cache.tags,
100
102
  visitor_id: cache.visitor.id,
101
103
  session_id: session.id,
104
+ platform: config.platform,
105
+ environment: config.environment,
102
106
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
103
107
  }
104
108
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\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(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\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type { EventName, TrackEventResponse, TrackName, TrackProperties } from './types';\nimport type { CreateTrackEventDTO } from '../schema/index';\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\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(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\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.id,\n platform: config.platform,\n environment: config.environment,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/types.ts"],"sourcesContent":["import type { UserProvidedData as GAUserProvidedData, StandardEvents } 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?: number;\n screen_width?: number;\n screen_height?: number;\n screen_resolution?: `${number}x${number}`;\n}\n\nexport interface AppInfo {\n /** iOS: IDFA, Android: Android Advertising ID */\n advertising_id?: string;\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 * ref: https://www.facebook.com/business/help/2360940870872492?checkpoint_src=any\n */\n fbc?: string;\n fbp?: string;\n fbclid?: string;\n ad_id?: string;\n ad_name?: string;\n adset_id?: string;\n adset_name?: string;\n campaign_id?: string;\n campaign_name?: string;\n placement?: string;\n site_source_name?: string;\n /** Google Analytics fields */\n gclid?: string;\n gclsrc?: string;\n gad_source?: string;\n gad_campaignid?: string;\n /** Reddit Ads fields */\n rdt_cid?: string;\n rdt_uuid?: string;\n /** LinkedIn Ads fields: get click id from url params or first-party cookie */\n li_fat_id?: string;\n // click ids\n dclid?: string; // Google Display Network\n ko_click_id?: string; // Kakao Ads\n msclkid?: string; // Microsoft Ads (Bing Ads)\n sccid?: string; // Snapchat Ads\n ttclid?: string; // TikTok Ads\n twclid?: string; // Twitter Ads (X Ads)\n wbraid?: string; // Google Ads (for iOS privacy)\n yclid?: string; // Yandex Ads\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 utm_id?: string;\n utm_source_platform?: string;\n utm_creative_format?: string;\n utm_marketing_tactic?: string;\n}\n\nexport interface TrackTags\n extends\n 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 session_id: string;\n properties?: TrackProperties<T>;\n timestamp: string;\n}[];\n\nexport interface TrackEvent<T extends EventName = EventName> {\n id: string;\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string;\n session_id: string;\n properties?: TrackProperties<T>;\n created_at: string;\n}\n\nexport type TrackEventResponse = {\n /** track event id: Meta Pixel will use event_id and event_name for deduplication */\n id: string;\n}[];\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/track/types.ts"],"sourcesContent":["import type { UserProvidedData as GAUserProvidedData, StandardEvents } 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 type Platform = 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';\nexport type Environment = 'development' | 'production';\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 /** @deprecated */\n platform: Platform;\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?: number;\n screen_width?: number;\n screen_height?: number;\n screen_resolution?: `${number}x${number}`;\n}\n\nexport interface AppInfo {\n /** iOS: IDFA, Android: Android Advertising ID */\n advertising_id?: string;\n install_referrer?: string;\n}\n\nexport interface EnvironmentInfo {\n release?: string;\n language?: string;\n time_zone?: string;\n /** @deprecated */\n environment: Environment;\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 * ref: https://www.facebook.com/business/help/2360940870872492?checkpoint_src=any\n */\n fbc?: string;\n fbp?: string;\n fbclid?: string;\n ad_id?: string;\n ad_name?: string;\n adset_id?: string;\n adset_name?: string;\n campaign_id?: string;\n campaign_name?: string;\n placement?: string;\n site_source_name?: string;\n /** Google Analytics fields */\n gclid?: string;\n gclsrc?: string;\n gad_source?: string;\n gad_campaignid?: string;\n /** Reddit Ads fields */\n rdt_cid?: string;\n rdt_uuid?: string;\n /** LinkedIn Ads fields: get click id from url params or first-party cookie */\n li_fat_id?: string;\n // click ids\n dclid?: string; // Google Display Network\n ko_click_id?: string; // Kakao Ads\n msclkid?: string; // Microsoft Ads (Bing Ads)\n sccid?: string; // Snapchat Ads\n ttclid?: string; // TikTok Ads\n twclid?: string; // Twitter Ads (X Ads)\n wbraid?: string; // Google Ads (for iOS privacy)\n yclid?: string; // Yandex Ads\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 utm_id?: string;\n utm_source_platform?: string;\n utm_creative_format?: string;\n utm_marketing_tactic?: string;\n}\n\nexport interface TrackTags\n extends\n 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 interface TrackEvent<T extends EventName = EventName> {\n id: string;\n name: TrackName<T>;\n tags: TrackTags;\n visitor_id: string;\n session_id: string;\n platform: Platform;\n environment: Environment;\n properties?: TrackProperties<T>;\n created_at: string;\n}\n\nexport type TrackEventResponse = {\n /** track event id: Meta Pixel will use event_id and event_name for deduplication */\n id: string;\n}[];\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -4,6 +4,8 @@ type AllowedPropertyValues = string | number | boolean | null;
4
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
+ type Platform = 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';
8
+ type Environment = 'development' | 'production';
7
9
  interface UserData {
8
10
  userId: string;
9
11
  email?: string;
@@ -38,7 +40,8 @@ interface PlatformInfo {
38
40
  browser?: string;
39
41
  browser_name?: string;
40
42
  browser_version?: string;
41
- platform: 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';
43
+ /** @deprecated */
44
+ platform: Platform;
42
45
  }
43
46
  interface DeviceInfo {
44
47
  device?: string;
@@ -59,8 +62,9 @@ interface AppInfo {
59
62
  interface EnvironmentInfo {
60
63
  release?: string;
61
64
  language?: string;
62
- time_zone?: string | null;
63
- environment: 'development' | 'production';
65
+ time_zone?: string;
66
+ /** @deprecated */
67
+ environment: Environment;
64
68
  }
65
69
  interface SourceInfo {
66
70
  source_url?: string;
@@ -118,20 +122,14 @@ interface TrackTags extends PlatformInfo, DeviceInfo, AppInfo, EnvironmentInfo,
118
122
  idempotency_key?: string;
119
123
  [key: string]: string | number | boolean | null | undefined;
120
124
  }
121
- type CreateTrackEventDTO<T extends EventName = EventName> = {
122
- name: TrackName<T>;
123
- tags: TrackTags;
124
- visitor_id: string;
125
- session_id: string;
126
- properties?: TrackProperties<T>;
127
- timestamp: string;
128
- }[];
129
125
  interface TrackEvent<T extends EventName = EventName> {
130
126
  id: string;
131
127
  name: TrackName<T>;
132
128
  tags: TrackTags;
133
129
  visitor_id: string;
134
130
  session_id: string;
131
+ platform: Platform;
132
+ environment: Environment;
135
133
  properties?: TrackProperties<T>;
136
134
  created_at: string;
137
135
  }
@@ -140,4 +138,4 @@ type TrackEventResponse = {
140
138
  id: string;
141
139
  }[];
142
140
 
143
- export type { AdvertisingInfo, AllowedPropertyValues, AppInfo, CreateTrackEventDTO, DeviceInfo, EnvironmentInfo, EventName, PlatformInfo, SourceInfo, ThirdPartyTracker, TrackEvent, TrackEventResponse, TrackName, TrackProperties, TrackTags, UTMParams, UserData, UserProvidedData };
141
+ export type { AdvertisingInfo, AllowedPropertyValues, AppInfo, DeviceInfo, Environment, EnvironmentInfo, EventName, Platform, PlatformInfo, SourceInfo, ThirdPartyTracker, TrackEvent, TrackEventResponse, TrackName, TrackProperties, TrackTags, UTMParams, UserData, UserProvidedData };
@@ -4,6 +4,8 @@ type AllowedPropertyValues = string | number | boolean | null;
4
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
+ type Platform = 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';
8
+ type Environment = 'development' | 'production';
7
9
  interface UserData {
8
10
  userId: string;
9
11
  email?: string;
@@ -38,7 +40,8 @@ interface PlatformInfo {
38
40
  browser?: string;
39
41
  browser_name?: string;
40
42
  browser_version?: string;
41
- platform: 'ios' | 'android' | 'web' | 'macos' | 'windows' | 'linux' | 'unknown';
43
+ /** @deprecated */
44
+ platform: Platform;
42
45
  }
43
46
  interface DeviceInfo {
44
47
  device?: string;
@@ -59,8 +62,9 @@ interface AppInfo {
59
62
  interface EnvironmentInfo {
60
63
  release?: string;
61
64
  language?: string;
62
- time_zone?: string | null;
63
- environment: 'development' | 'production';
65
+ time_zone?: string;
66
+ /** @deprecated */
67
+ environment: Environment;
64
68
  }
65
69
  interface SourceInfo {
66
70
  source_url?: string;
@@ -118,20 +122,14 @@ interface TrackTags extends PlatformInfo, DeviceInfo, AppInfo, EnvironmentInfo,
118
122
  idempotency_key?: string;
119
123
  [key: string]: string | number | boolean | null | undefined;
120
124
  }
121
- type CreateTrackEventDTO<T extends EventName = EventName> = {
122
- name: TrackName<T>;
123
- tags: TrackTags;
124
- visitor_id: string;
125
- session_id: string;
126
- properties?: TrackProperties<T>;
127
- timestamp: string;
128
- }[];
129
125
  interface TrackEvent<T extends EventName = EventName> {
130
126
  id: string;
131
127
  name: TrackName<T>;
132
128
  tags: TrackTags;
133
129
  visitor_id: string;
134
130
  session_id: string;
131
+ platform: Platform;
132
+ environment: Environment;
135
133
  properties?: TrackProperties<T>;
136
134
  created_at: string;
137
135
  }
@@ -140,4 +138,4 @@ type TrackEventResponse = {
140
138
  id: string;
141
139
  }[];
142
140
 
143
- export type { AdvertisingInfo, AllowedPropertyValues, AppInfo, CreateTrackEventDTO, DeviceInfo, EnvironmentInfo, EventName, PlatformInfo, SourceInfo, ThirdPartyTracker, TrackEvent, TrackEventResponse, TrackName, TrackProperties, TrackTags, UTMParams, UserData, UserProvidedData };
141
+ export type { AdvertisingInfo, AllowedPropertyValues, AppInfo, DeviceInfo, Environment, EnvironmentInfo, EventName, Platform, PlatformInfo, SourceInfo, ThirdPartyTracker, TrackEvent, TrackEventResponse, TrackName, TrackProperties, TrackTags, UTMParams, UserData, UserProvidedData };
@@ -30,6 +30,8 @@ var key = "visitor_id";
30
30
  async function createVisitor() {
31
31
  const dto = {
32
32
  device_id: await import_setup.config.getDeviceId(),
33
+ platform: import_setup.config.platform,
34
+ environment: import_setup.config.environment,
33
35
  properties: await import_setup.config.getTags()
34
36
  };
35
37
  const response = await (0, import_fetch.fetch)(`${import_setup.config.endpoint}/visitors`, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { CreateVisitorDTO, UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAC9B,mBAAsB;AAGtB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,oBAAO,YAAY;AAAA,IACpC,YAAa,MAAM,oBAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,sBAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,oBAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,mBAAM,QAAS,QAAO,mBAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,qBAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,mBAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,sBAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,qBAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAC9B,mBAAsB;AAItB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,oBAAO,YAAY;AAAA,IACpC,UAAU,oBAAO;AAAA,IACjB,aAAa,oBAAO;AAAA,IACpB,YAAa,MAAM,oBAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,sBAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,oBAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,mBAAM,QAAS,QAAO,mBAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,qBAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,mBAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,UAAM,oBAAM,GAAG,oBAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,oBAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,sBAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,qBAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
@@ -1,5 +1,6 @@
1
1
  import { Visitor, UpdateVisitorDTO } from './types.cjs';
2
2
  import '../track/gtag.cjs';
3
+ import '../track/types.cjs';
3
4
 
4
5
  declare function getVisitor(): Promise<Visitor>;
5
6
  declare function setVisitor(dto: UpdateVisitorDTO): Promise<Visitor>;
@@ -1,5 +1,6 @@
1
1
  import { Visitor, UpdateVisitorDTO } from './types.js';
2
2
  import '../track/gtag.js';
3
+ import '../track/types.js';
3
4
 
4
5
  declare function getVisitor(): Promise<Visitor>;
5
6
  declare function setVisitor(dto: UpdateVisitorDTO): Promise<Visitor>;
@@ -5,6 +5,8 @@ var key = "visitor_id";
5
5
  async function createVisitor() {
6
6
  const dto = {
7
7
  device_id: await config.getDeviceId(),
8
+ platform: config.platform,
9
+ environment: config.environment,
8
10
  properties: await config.getTags()
9
11
  };
10
12
  const response = await fetch(`${config.endpoint}/visitors`, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { CreateVisitorDTO, UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,aAAa;AAGtB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,OAAO,YAAY;AAAA,IACpC,YAAa,MAAM,OAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,MAAM,QAAS,QAAO,MAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,QAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,MAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,SAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,QAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/visitor/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport type { UpdateVisitorDTO, Visitor, VisitorProperties } from './types';\nimport type { CreateVisitorDTO } from '../schema/index';\n\nconst key = 'visitor_id';\n\nasync function createVisitor(): Promise<Visitor> {\n const dto: CreateVisitorDTO = {\n device_id: await config.getDeviceId(),\n platform: config.platform,\n environment: config.environment,\n properties: (await config.getTags()) as VisitorProperties,\n };\n\n const response = await fetch(`${config.endpoint}/visitors`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n const data = (await response.json()) as Visitor;\n config.storage.setItem(key, data.id);\n return data;\n}\n\nasync function getOrCreateVisitor(): Promise<Visitor> {\n const visitorId = config.storage.getItem(key);\n if (visitorId) {\n const response = await fetch(`${config.endpoint}/visitors/${visitorId}`, {\n method: 'GET',\n credentials: 'include',\n headers: await config.getHeaders(),\n });\n\n if (!response.ok) return createVisitor();\n return response.json() as Promise<Visitor>;\n } else {\n return createVisitor();\n }\n}\n\nlet visitorFetcher: Promise<Visitor> | null = null;\n\nexport async function getVisitor(): Promise<Visitor> {\n if (cache.visitor) return cache.visitor;\n if (visitorFetcher) return visitorFetcher;\n visitorFetcher = getOrCreateVisitor();\n cache.visitor = await visitorFetcher;\n visitorFetcher = null;\n return cache.visitor;\n}\n\nexport async function setVisitor(dto: UpdateVisitorDTO) {\n const { id } = await getVisitor();\n const response = await fetch(`${config.endpoint}/visitors/${id}`, {\n method: 'PATCH',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) throw new Error('Failed to set visitor');\n const data = (await response.json()) as Visitor;\n\n config.thirdPartyUserSetters.forEach((setter) => setter(dto));\n cache.visitor = data;\n return data;\n}\n"],"mappings":";AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,aAAa;AAItB,IAAM,MAAM;AAEZ,eAAe,gBAAkC;AAC/C,QAAM,MAAwB;AAAA,IAC5B,WAAW,MAAM,OAAO,YAAY;AAAA,IACpC,UAAU,OAAO;AAAA,IACjB,aAAa,OAAO;AAAA,IACpB,YAAa,MAAM,OAAO,QAAQ;AAAA,EACpC;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,QAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,SAAO,QAAQ,QAAQ,KAAK,KAAK,EAAE;AACnC,SAAO;AACT;AAEA,eAAe,qBAAuC;AACpD,QAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAC5C,MAAI,WAAW;AACb,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,SAAS,IAAI;AAAA,MACvE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACnC,CAAC;AAED,QAAI,CAAC,SAAS,GAAI,QAAO,cAAc;AACvC,WAAO,SAAS,KAAK;AAAA,EACvB,OAAO;AACL,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,IAAI,iBAA0C;AAE9C,eAAsB,aAA+B;AACnD,MAAI,MAAM,QAAS,QAAO,MAAM;AAChC,MAAI,eAAgB,QAAO;AAC3B,mBAAiB,mBAAmB;AACpC,QAAM,UAAU,MAAM;AACtB,mBAAiB;AACjB,SAAO,MAAM;AACf;AAEA,eAAsB,WAAW,KAAuB;AACtD,QAAM,EAAE,GAAG,IAAI,MAAM,WAAW;AAChC,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,QAAQ,aAAa,EAAE,IAAI;AAAA,IAChE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,SAAS,MAAM,OAAO,WAAW;AAAA,IACjC,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,uBAAuB;AACzD,QAAM,OAAQ,MAAM,SAAS,KAAK;AAElC,SAAO,sBAAsB,QAAQ,CAAC,WAAW,OAAO,GAAG,CAAC;AAC5D,QAAM,UAAU;AAChB,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/visitor/types.ts"],"sourcesContent":["import type { UserProperties, UserProvidedData } from '../track/gtag';\n\nexport type VisitorProperties = Record<Lowercase<string>, string | number | boolean | null>;\n\nexport interface Visitor {\n id: string;\n device_id: string;\n properties: VisitorProperties;\n}\n\nexport interface CreateVisitorDTO {\n device_id: string;\n properties?: VisitorProperties;\n}\n\nexport interface UpdateVisitorDTO {\n user_id?: string;\n distinct_id?: string;\n data?: UserProvidedData;\n properties?: UserProperties;\n}\n\nexport type ThirdPartyUserSetter = (dto: UpdateVisitorDTO) => void;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../src/visitor/types.ts"],"sourcesContent":["import type { UserProperties, UserProvidedData } from '../track/gtag';\nimport type { Environment, Platform } from '../track/types';\n\nexport type VisitorProperties = Record<Lowercase<string>, string | number | boolean | null>;\n\nexport interface Visitor {\n id: string;\n device_id: string;\n platform: Platform;\n environment: Environment;\n properties: VisitorProperties;\n}\n\nexport interface UpdateVisitorDTO {\n user_id?: string;\n distinct_id?: string;\n data?: UserProvidedData;\n properties?: UserProperties;\n}\n\nexport type ThirdPartyUserSetter = (dto: UpdateVisitorDTO) => void;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}