@shware/analytics 2.10.0 → 2.11.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.
- package/README.md +14 -2
- package/dist/server/linkedin-conversions-api.cjs +12 -6
- package/dist/server/linkedin-conversions-api.cjs.map +1 -1
- package/dist/server/linkedin-conversions-api.d.cts +4 -4
- package/dist/server/linkedin-conversions-api.d.ts +4 -4
- package/dist/server/linkedin-conversions-api.mjs +12 -6
- package/dist/server/linkedin-conversions-api.mjs.map +1 -1
- package/dist/third-parties/index.cjs +9 -4
- package/dist/third-parties/index.cjs.map +1 -1
- package/dist/third-parties/index.d.cts +3 -1
- package/dist/third-parties/index.d.ts +3 -1
- package/dist/third-parties/index.mjs +6 -3
- package/dist/third-parties/index.mjs.map +1 -1
- package/dist/third-parties/linkedin-insight-tag.cjs +24 -3
- package/dist/third-parties/linkedin-insight-tag.cjs.map +1 -1
- package/dist/third-parties/linkedin-insight-tag.d.cts +22 -2
- package/dist/third-parties/linkedin-insight-tag.d.ts +22 -2
- package/dist/third-parties/linkedin-insight-tag.mjs +22 -2
- package/dist/third-parties/linkedin-insight-tag.mjs.map +1 -1
- package/dist/third-parties/meta-pixel.cjs +2 -3
- package/dist/third-parties/meta-pixel.cjs.map +1 -1
- package/dist/third-parties/meta-pixel.mjs +2 -3
- package/dist/third-parties/meta-pixel.mjs.map +1 -1
- package/dist/third-parties/reddit-pixel.cjs +8 -9
- package/dist/third-parties/reddit-pixel.cjs.map +1 -1
- package/dist/third-parties/reddit-pixel.d.cts +3 -3
- package/dist/third-parties/reddit-pixel.d.ts +3 -3
- package/dist/third-parties/reddit-pixel.mjs +6 -7
- package/dist/third-parties/reddit-pixel.mjs.map +1 -1
- package/dist/track/lintrk.cjs.map +1 -1
- package/dist/track/lintrk.d.cts +4 -0
- package/dist/track/lintrk.d.ts +4 -0
- package/dist/track/types.cjs.map +1 -1
- package/dist/track/types.d.cts +2 -1
- package/dist/track/types.d.ts +2 -1
- package/dist/web/index.cjs +2 -1
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.mjs +2 -1
- package/dist/web/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# Shware Analytics SDK
|
|
2
|
+
|
|
1
3
|
## Config
|
|
2
4
|
|
|
3
5
|
layout.tsx
|
|
@@ -59,5 +61,15 @@ function Button() {
|
|
|
59
61
|
|
|
60
62
|
## Third Parties Advices
|
|
61
63
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
### Reddit
|
|
65
|
+
|
|
66
|
+
We strongly recommend using the Reddit Pixel and Conversions API (CAPI) together.
|
|
67
|
+
|
|
68
|
+
- rdt_cid: from url params
|
|
69
|
+
- \_rdt_uuid: from first-party cookie
|
|
70
|
+
|
|
71
|
+
### LinkedIn
|
|
72
|
+
|
|
73
|
+
If we receive an Insight Tag event and a Conversions API event from the same account with the same eventId, we discard the Conversions API event and count only the Insight Tag event in campaign reporting.
|
|
74
|
+
|
|
75
|
+
- [Click IDs](https://learn.microsoft.com/en-us/linkedin/marketing/conversions/enabling-first-party-cookies?view=li-lms-2025-10&source=recommendations): get li_fat_id from url params and cookie
|
|
@@ -25,8 +25,8 @@ __export(linkedin_conversions_api_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(linkedin_conversions_api_exports);
|
|
26
26
|
var import_crypto = require("crypto");
|
|
27
27
|
var import_field = require("../utils/field.cjs");
|
|
28
|
-
async function sendEvents(accessToken,
|
|
29
|
-
const eventNames = Object.keys(
|
|
28
|
+
async function sendEvents(accessToken, config, events, data = {}) {
|
|
29
|
+
const eventNames = Object.keys(config);
|
|
30
30
|
const address = (0, import_field.getFirst)(data.address);
|
|
31
31
|
const userIds = [];
|
|
32
32
|
const externalIds = data.user_id ? [data.user_id] : void 0;
|
|
@@ -48,16 +48,22 @@ async function sendEvents(accessToken, conversions, events, data = {}) {
|
|
|
48
48
|
var _a, _b, _c, _d;
|
|
49
49
|
return {
|
|
50
50
|
eventId: event.id,
|
|
51
|
-
conversion: `urn:lla:llaPartnerConversion:${
|
|
51
|
+
conversion: `urn:lla:llaPartnerConversion:${config[event.name]}`,
|
|
52
52
|
conversionHappenedAt: Date.now(),
|
|
53
53
|
conversionValue: {
|
|
54
54
|
currencyCode: ((_b = (_a = event.properties) == null ? void 0 : _a.currency) == null ? void 0 : _b.toUpperCase()) ?? "USD",
|
|
55
55
|
amount: ((_d = (_c = event.properties) == null ? void 0 : _c.value) == null ? void 0 : _d.toString()) ?? "0"
|
|
56
56
|
},
|
|
57
57
|
user: {
|
|
58
|
-
userIds
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
userIds: event.tags.li_fat_id ? [
|
|
59
|
+
{
|
|
60
|
+
idType: "LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",
|
|
61
|
+
idValue: event.tags.li_fat_id
|
|
62
|
+
},
|
|
63
|
+
...userIds
|
|
64
|
+
] : userIds,
|
|
65
|
+
userInfo,
|
|
66
|
+
externalIds
|
|
61
67
|
}
|
|
62
68
|
};
|
|
63
69
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/linkedin-conversions-api.ts"],"sourcesContent":["/**\n * Conversions API Payload Builder: https://www.linkedin.com/developers/payload-builder\n * https://learn.microsoft.com/en-us/linkedin/marketing/conversions/conversions-overview?view=li-lms-2025-09\n */\nimport { createHash } from 'crypto';\nimport { getFirst } from '../utils/field';\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../src/server/linkedin-conversions-api.ts"],"sourcesContent":["/**\n * Conversions API Payload Builder: https://www.linkedin.com/developers/payload-builder\n * https://learn.microsoft.com/en-us/linkedin/marketing/conversions/conversions-overview?view=li-lms-2025-09\n */\nimport { createHash } from 'crypto';\nimport { getFirst } from '../utils/field';\nimport type { TrackEvent, TrackName, UserProvidedData } from '../track/types';\n\ntype UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface CreateLinkedinEventDTO {\n /**\n * For any conversion that you want to send through multiple methods, such as Insight Tag and\n * Conversions API, you must create a conversion rule for each data source (browser and server).\n * Then, you can implement a logic to pick up the eventId from the browser and send it with the\n * corresponding event from your server. If we receive an Insight Tag event and a Conversions API\n * event from the same account with the same eventId, we discard the Conversions API event and\n * count only the Insight Tag event in campaign reporting.\n */\n eventId?: string;\n\n /**\n * Replace <id> with the conversion ID extracted when creating the conversion rule\n * (e.g. urn:lla:llaPartnerConversion:<id>).\n */\n conversion: `urn:lla:llaPartnerConversion:${number}`;\n\n /** Epoch timestamp in milliseconds at which the conversion event happened. */\n conversionHappenedAt: number;\n conversionValue: { currencyCode: string; amount: string };\n user: {\n userIds: { idType: UserIdType; idValue: string }[];\n userInfo?: {\n firstName?: string;\n lastName?: string;\n companyName?: string;\n countryCode?: string;\n title?: string;\n };\n\n /**\n * The maximum supported size of the list is 1 at the moment. If the list contains multiple\n * values, only the first value will be used.\n */\n externalIds?: [string, ...string[]];\n\n /**\n * This is generated when users submit the Linkedin Lead-gen form\n * (e.g. urn:li:leadGenFormResponse:<id>).\n */\n lead?: `urn:li:leadGenFormResponse:${string}`;\n };\n}\n\nexport interface CreateMultipleLinkedinEventsDTO {\n elements: CreateLinkedinEventDTO[];\n}\n\nexport type LinkedinConversionConfig = Record<TrackName, number>;\n\nexport async function sendEvents(\n accessToken: string,\n config: LinkedinConversionConfig,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {}\n) {\n const eventNames = Object.keys(config);\n const address = getFirst(data.address);\n const userIds: { idType: UserIdType; idValue: string }[] = [];\n const externalIds: [string, ...string[]] | undefined = data.user_id ? [data.user_id] : undefined;\n const userInfo = address\n ? {\n firstName: address.first_name,\n lastName: address.last_name,\n countryCode: address.country,\n }\n : undefined;\n\n if (data.email) {\n const email = getFirst(data.email);\n if (email)\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue: createHash('sha256').update(email).digest('hex'),\n });\n }\n\n const dto: CreateMultipleLinkedinEventsDTO = {\n elements: events\n .filter((event) => eventNames.includes(event.name))\n .map((event) => ({\n eventId: event.id,\n conversion: `urn:lla:llaPartnerConversion:${config[event.name]}`,\n conversionHappenedAt: Date.now(),\n conversionValue: {\n currencyCode: event.properties?.currency?.toUpperCase() ?? 'USD',\n amount: event.properties?.value?.toString() ?? '0',\n },\n user: {\n userIds: event.tags.li_fat_id\n ? [\n {\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: event.tags.li_fat_id,\n },\n ...userIds,\n ]\n : userIds,\n userInfo,\n externalIds,\n },\n })),\n };\n\n if (dto.elements.length === 0) return;\n const response = await fetch('https://api.linkedin.com/rest/conversionEvents', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'LinkedIn-Version': '202509',\n 'X-Restli-Protocol-Version': '2.0.0',\n },\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n console.error('Failed to send LinkedIn conversion events:', await response.text());\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,oBAA2B;AAC3B,mBAAyB;AA2DzB,eAAsB,WACpB,aACA,QAEA,QACA,OAAyB,CAAC,GAC1B;AACA,QAAM,aAAa,OAAO,KAAK,MAAM;AACrC,QAAM,cAAU,uBAAS,KAAK,OAAO;AACrC,QAAM,UAAqD,CAAC;AAC5D,QAAM,cAAiD,KAAK,UAAU,CAAC,KAAK,OAAO,IAAI;AACvF,QAAM,WAAW,UACb;AAAA,IACE,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB,IACA;AAEJ,MAAI,KAAK,OAAO;AACd,UAAM,YAAQ,uBAAS,KAAK,KAAK;AACjC,QAAI;AACF,cAAQ,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,aAAS,0BAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,MAC1D,CAAC;AAAA,EACL;AAEA,QAAM,MAAuC;AAAA,IAC3C,UAAU,OACP,OAAO,CAAC,UAAU,WAAW,SAAS,MAAM,IAAI,CAAC,EACjD,IAAI,CAAC,UAAO;AA/FnB;AA+FuB;AAAA,QACf,SAAS,MAAM;AAAA,QACf,YAAY,gCAAgC,OAAO,MAAM,IAAI,CAAC;AAAA,QAC9D,sBAAsB,KAAK,IAAI;AAAA,QAC/B,iBAAiB;AAAA,UACf,gBAAc,iBAAM,eAAN,mBAAkB,aAAlB,mBAA4B,kBAAiB;AAAA,UAC3D,UAAQ,iBAAM,eAAN,mBAAkB,UAAlB,mBAAyB,eAAc;AAAA,QACjD;AAAA,QACA,MAAM;AAAA,UACJ,SAAS,MAAM,KAAK,YAChB;AAAA,YACE;AAAA,cACE,QAAQ;AAAA,cACR,SAAS,MAAM,KAAK;AAAA,YACtB;AAAA,YACA,GAAG;AAAA,UACL,IACA;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,KAAE;AAAA,EACN;AAEA,MAAI,IAAI,SAAS,WAAW,EAAG;AAC/B,QAAM,WAAW,MAAM,MAAM,kDAAkD;AAAA,IAC7E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,6BAA6B;AAAA,IAC/B;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,8CAA8C,MAAM,SAAS,KAAK,CAAC;AAAA,EACnF;AACF;","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TrackName, TrackEvent, UserProvidedData } from '../track/types.cjs';
|
|
2
2
|
import '../track/gtag.cjs';
|
|
3
3
|
|
|
4
4
|
type UserIdType = 'SHA256_EMAIL' | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID' | 'ACXIOM_ID' | 'ORACLE_MOAT_ID';
|
|
@@ -50,7 +50,7 @@ interface CreateLinkedinEventDTO {
|
|
|
50
50
|
interface CreateMultipleLinkedinEventsDTO {
|
|
51
51
|
elements: CreateLinkedinEventDTO[];
|
|
52
52
|
}
|
|
53
|
-
type
|
|
54
|
-
declare function sendEvents(accessToken: string,
|
|
53
|
+
type LinkedinConversionConfig = Record<TrackName, number>;
|
|
54
|
+
declare function sendEvents(accessToken: string, config: LinkedinConversionConfig, events: TrackEvent<any>[], data?: UserProvidedData): Promise<void>;
|
|
55
55
|
|
|
56
|
-
export { type
|
|
56
|
+
export { type CreateLinkedinEventDTO, type CreateMultipleLinkedinEventsDTO, type LinkedinConversionConfig, sendEvents };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TrackName, TrackEvent, UserProvidedData } from '../track/types.js';
|
|
2
2
|
import '../track/gtag.js';
|
|
3
3
|
|
|
4
4
|
type UserIdType = 'SHA256_EMAIL' | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID' | 'ACXIOM_ID' | 'ORACLE_MOAT_ID';
|
|
@@ -50,7 +50,7 @@ interface CreateLinkedinEventDTO {
|
|
|
50
50
|
interface CreateMultipleLinkedinEventsDTO {
|
|
51
51
|
elements: CreateLinkedinEventDTO[];
|
|
52
52
|
}
|
|
53
|
-
type
|
|
54
|
-
declare function sendEvents(accessToken: string,
|
|
53
|
+
type LinkedinConversionConfig = Record<TrackName, number>;
|
|
54
|
+
declare function sendEvents(accessToken: string, config: LinkedinConversionConfig, events: TrackEvent<any>[], data?: UserProvidedData): Promise<void>;
|
|
55
55
|
|
|
56
|
-
export { type
|
|
56
|
+
export { type CreateLinkedinEventDTO, type CreateMultipleLinkedinEventsDTO, type LinkedinConversionConfig, sendEvents };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/server/linkedin-conversions-api.ts
|
|
2
2
|
import { createHash } from "crypto";
|
|
3
3
|
import { getFirst } from "../utils/field.mjs";
|
|
4
|
-
async function sendEvents(accessToken,
|
|
5
|
-
const eventNames = Object.keys(
|
|
4
|
+
async function sendEvents(accessToken, config, events, data = {}) {
|
|
5
|
+
const eventNames = Object.keys(config);
|
|
6
6
|
const address = getFirst(data.address);
|
|
7
7
|
const userIds = [];
|
|
8
8
|
const externalIds = data.user_id ? [data.user_id] : void 0;
|
|
@@ -24,16 +24,22 @@ async function sendEvents(accessToken, conversions, events, data = {}) {
|
|
|
24
24
|
var _a, _b, _c, _d;
|
|
25
25
|
return {
|
|
26
26
|
eventId: event.id,
|
|
27
|
-
conversion: `urn:lla:llaPartnerConversion:${
|
|
27
|
+
conversion: `urn:lla:llaPartnerConversion:${config[event.name]}`,
|
|
28
28
|
conversionHappenedAt: Date.now(),
|
|
29
29
|
conversionValue: {
|
|
30
30
|
currencyCode: ((_b = (_a = event.properties) == null ? void 0 : _a.currency) == null ? void 0 : _b.toUpperCase()) ?? "USD",
|
|
31
31
|
amount: ((_d = (_c = event.properties) == null ? void 0 : _c.value) == null ? void 0 : _d.toString()) ?? "0"
|
|
32
32
|
},
|
|
33
33
|
user: {
|
|
34
|
-
userIds
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
userIds: event.tags.li_fat_id ? [
|
|
35
|
+
{
|
|
36
|
+
idType: "LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID",
|
|
37
|
+
idValue: event.tags.li_fat_id
|
|
38
|
+
},
|
|
39
|
+
...userIds
|
|
40
|
+
] : userIds,
|
|
41
|
+
userInfo,
|
|
42
|
+
externalIds
|
|
37
43
|
}
|
|
38
44
|
};
|
|
39
45
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/linkedin-conversions-api.ts"],"sourcesContent":["/**\n * Conversions API Payload Builder: https://www.linkedin.com/developers/payload-builder\n * https://learn.microsoft.com/en-us/linkedin/marketing/conversions/conversions-overview?view=li-lms-2025-09\n */\nimport { createHash } from 'crypto';\nimport { getFirst } from '../utils/field';\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../src/server/linkedin-conversions-api.ts"],"sourcesContent":["/**\n * Conversions API Payload Builder: https://www.linkedin.com/developers/payload-builder\n * https://learn.microsoft.com/en-us/linkedin/marketing/conversions/conversions-overview?view=li-lms-2025-09\n */\nimport { createHash } from 'crypto';\nimport { getFirst } from '../utils/field';\nimport type { TrackEvent, TrackName, UserProvidedData } from '../track/types';\n\ntype UserIdType =\n | 'SHA256_EMAIL'\n | 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID'\n | 'ACXIOM_ID'\n | 'ORACLE_MOAT_ID';\n\nexport interface CreateLinkedinEventDTO {\n /**\n * For any conversion that you want to send through multiple methods, such as Insight Tag and\n * Conversions API, you must create a conversion rule for each data source (browser and server).\n * Then, you can implement a logic to pick up the eventId from the browser and send it with the\n * corresponding event from your server. If we receive an Insight Tag event and a Conversions API\n * event from the same account with the same eventId, we discard the Conversions API event and\n * count only the Insight Tag event in campaign reporting.\n */\n eventId?: string;\n\n /**\n * Replace <id> with the conversion ID extracted when creating the conversion rule\n * (e.g. urn:lla:llaPartnerConversion:<id>).\n */\n conversion: `urn:lla:llaPartnerConversion:${number}`;\n\n /** Epoch timestamp in milliseconds at which the conversion event happened. */\n conversionHappenedAt: number;\n conversionValue: { currencyCode: string; amount: string };\n user: {\n userIds: { idType: UserIdType; idValue: string }[];\n userInfo?: {\n firstName?: string;\n lastName?: string;\n companyName?: string;\n countryCode?: string;\n title?: string;\n };\n\n /**\n * The maximum supported size of the list is 1 at the moment. If the list contains multiple\n * values, only the first value will be used.\n */\n externalIds?: [string, ...string[]];\n\n /**\n * This is generated when users submit the Linkedin Lead-gen form\n * (e.g. urn:li:leadGenFormResponse:<id>).\n */\n lead?: `urn:li:leadGenFormResponse:${string}`;\n };\n}\n\nexport interface CreateMultipleLinkedinEventsDTO {\n elements: CreateLinkedinEventDTO[];\n}\n\nexport type LinkedinConversionConfig = Record<TrackName, number>;\n\nexport async function sendEvents(\n accessToken: string,\n config: LinkedinConversionConfig,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n events: TrackEvent<any>[],\n data: UserProvidedData = {}\n) {\n const eventNames = Object.keys(config);\n const address = getFirst(data.address);\n const userIds: { idType: UserIdType; idValue: string }[] = [];\n const externalIds: [string, ...string[]] | undefined = data.user_id ? [data.user_id] : undefined;\n const userInfo = address\n ? {\n firstName: address.first_name,\n lastName: address.last_name,\n countryCode: address.country,\n }\n : undefined;\n\n if (data.email) {\n const email = getFirst(data.email);\n if (email)\n userIds.push({\n idType: 'SHA256_EMAIL',\n idValue: createHash('sha256').update(email).digest('hex'),\n });\n }\n\n const dto: CreateMultipleLinkedinEventsDTO = {\n elements: events\n .filter((event) => eventNames.includes(event.name))\n .map((event) => ({\n eventId: event.id,\n conversion: `urn:lla:llaPartnerConversion:${config[event.name]}`,\n conversionHappenedAt: Date.now(),\n conversionValue: {\n currencyCode: event.properties?.currency?.toUpperCase() ?? 'USD',\n amount: event.properties?.value?.toString() ?? '0',\n },\n user: {\n userIds: event.tags.li_fat_id\n ? [\n {\n idType: 'LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID',\n idValue: event.tags.li_fat_id,\n },\n ...userIds,\n ]\n : userIds,\n userInfo,\n externalIds,\n },\n })),\n };\n\n if (dto.elements.length === 0) return;\n const response = await fetch('https://api.linkedin.com/rest/conversionEvents', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n 'LinkedIn-Version': '202509',\n 'X-Restli-Protocol-Version': '2.0.0',\n },\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n console.error('Failed to send LinkedIn conversion events:', await response.text());\n }\n}\n"],"mappings":";AAIA,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AA2DzB,eAAsB,WACpB,aACA,QAEA,QACA,OAAyB,CAAC,GAC1B;AACA,QAAM,aAAa,OAAO,KAAK,MAAM;AACrC,QAAM,UAAU,SAAS,KAAK,OAAO;AACrC,QAAM,UAAqD,CAAC;AAC5D,QAAM,cAAiD,KAAK,UAAU,CAAC,KAAK,OAAO,IAAI;AACvF,QAAM,WAAW,UACb;AAAA,IACE,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB,IACA;AAEJ,MAAI,KAAK,OAAO;AACd,UAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,QAAI;AACF,cAAQ,KAAK;AAAA,QACX,QAAQ;AAAA,QACR,SAAS,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,MAC1D,CAAC;AAAA,EACL;AAEA,QAAM,MAAuC;AAAA,IAC3C,UAAU,OACP,OAAO,CAAC,UAAU,WAAW,SAAS,MAAM,IAAI,CAAC,EACjD,IAAI,CAAC,UAAO;AA/FnB;AA+FuB;AAAA,QACf,SAAS,MAAM;AAAA,QACf,YAAY,gCAAgC,OAAO,MAAM,IAAI,CAAC;AAAA,QAC9D,sBAAsB,KAAK,IAAI;AAAA,QAC/B,iBAAiB;AAAA,UACf,gBAAc,iBAAM,eAAN,mBAAkB,aAAlB,mBAA4B,kBAAiB;AAAA,UAC3D,UAAQ,iBAAM,eAAN,mBAAkB,UAAlB,mBAAyB,eAAc;AAAA,QACjD;AAAA,QACA,MAAM;AAAA,UACJ,SAAS,MAAM,KAAK,YAChB;AAAA,YACE;AAAA,cACE,QAAQ;AAAA,cACR,SAAS,MAAM,KAAK;AAAA,YACtB;AAAA,YACA,GAAG;AAAA,UACL,IACA;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,KAAE;AAAA,EACN;AAEA,MAAI,IAAI,SAAS,WAAW,EAAG;AAC/B,QAAM,WAAW,MAAM,MAAM,kDAAkD;AAAA,IAC7E,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,UAAU,WAAW;AAAA,MACpC,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,6BAA6B;AAAA,IAC/B;AAAA,IACA,MAAM,KAAK,UAAU,GAAG;AAAA,EAC1B,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,YAAQ,MAAM,8CAA8C,MAAM,SAAS,KAAK,CAAC;AAAA,EACnF;AACF;","names":[]}
|
|
@@ -22,22 +22,27 @@ var third_parties_exports = {};
|
|
|
22
22
|
__export(third_parties_exports, {
|
|
23
23
|
sendFBEvent: () => import_meta_pixel.sendFBEvent,
|
|
24
24
|
sendGAEvent: () => import_google_analytics.sendGAEvent,
|
|
25
|
-
|
|
25
|
+
sendLinkedinEvent: () => import_linkedin_insight_tag.sendLinkedinEvent,
|
|
26
|
+
sendRedditEvent: () => import_reddit_pixel.sendRedditEvent,
|
|
26
27
|
setFBUser: () => import_meta_pixel.setFBUser,
|
|
27
28
|
setGAUser: () => import_google_analytics.setGAUser,
|
|
28
|
-
|
|
29
|
+
setLinkedinUser: () => import_linkedin_insight_tag.setLinkedinUser,
|
|
30
|
+
setRedditUser: () => import_reddit_pixel.setRedditUser
|
|
29
31
|
});
|
|
30
32
|
module.exports = __toCommonJS(third_parties_exports);
|
|
31
33
|
var import_google_analytics = require("./google-analytics.cjs");
|
|
32
34
|
var import_meta_pixel = require("./meta-pixel.cjs");
|
|
33
35
|
var import_reddit_pixel = require("./reddit-pixel.cjs");
|
|
36
|
+
var import_linkedin_insight_tag = require("./linkedin-insight-tag.cjs");
|
|
34
37
|
// Annotate the CommonJS export names for ESM import in node:
|
|
35
38
|
0 && (module.exports = {
|
|
36
39
|
sendFBEvent,
|
|
37
40
|
sendGAEvent,
|
|
38
|
-
|
|
41
|
+
sendLinkedinEvent,
|
|
42
|
+
sendRedditEvent,
|
|
39
43
|
setFBUser,
|
|
40
44
|
setGAUser,
|
|
41
|
-
|
|
45
|
+
setLinkedinUser,
|
|
46
|
+
setRedditUser
|
|
42
47
|
});
|
|
43
48
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport {
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport { sendRedditEvent, setRedditUser } from './reddit-pixel';\nexport { sendLinkedinEvent, setLinkedinUser } from './linkedin-insight-tag';\n\nexport type { LinkedinConversionConfig } from './linkedin-insight-tag';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAuC;AACvC,wBAAuC;AACvC,0BAA+C;AAC/C,kCAAmD;","names":[]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { sendGAEvent, setGAUser } from './google-analytics.cjs';
|
|
2
2
|
export { sendFBEvent, setFBUser } from './meta-pixel.cjs';
|
|
3
|
-
export {
|
|
3
|
+
export { sendRedditEvent, setRedditUser } from './reddit-pixel.cjs';
|
|
4
|
+
export { LinkedinConversionConfig, sendLinkedinEvent, setLinkedinUser } from './linkedin-insight-tag.cjs';
|
|
4
5
|
import '../track/gtag.cjs';
|
|
5
6
|
import '../track/types.cjs';
|
|
6
7
|
import '../visitor/types.cjs';
|
|
7
8
|
import '../track/fbq.cjs';
|
|
8
9
|
import '../track/rdt.cjs';
|
|
10
|
+
import '../track/lintrk.cjs';
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { sendGAEvent, setGAUser } from './google-analytics.js';
|
|
2
2
|
export { sendFBEvent, setFBUser } from './meta-pixel.js';
|
|
3
|
-
export {
|
|
3
|
+
export { sendRedditEvent, setRedditUser } from './reddit-pixel.js';
|
|
4
|
+
export { LinkedinConversionConfig, sendLinkedinEvent, setLinkedinUser } from './linkedin-insight-tag.js';
|
|
4
5
|
import '../track/gtag.js';
|
|
5
6
|
import '../track/types.js';
|
|
6
7
|
import '../visitor/types.js';
|
|
7
8
|
import '../track/fbq.js';
|
|
8
9
|
import '../track/rdt.js';
|
|
10
|
+
import '../track/lintrk.js';
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
// src/third-parties/index.ts
|
|
2
2
|
import { sendGAEvent, setGAUser } from "./google-analytics.mjs";
|
|
3
3
|
import { sendFBEvent, setFBUser } from "./meta-pixel.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import { sendRedditEvent, setRedditUser } from "./reddit-pixel.mjs";
|
|
5
|
+
import { sendLinkedinEvent, setLinkedinUser } from "./linkedin-insight-tag.mjs";
|
|
5
6
|
export {
|
|
6
7
|
sendFBEvent,
|
|
7
8
|
sendGAEvent,
|
|
8
|
-
|
|
9
|
+
sendLinkedinEvent,
|
|
10
|
+
sendRedditEvent,
|
|
9
11
|
setFBUser,
|
|
10
12
|
setGAUser,
|
|
11
|
-
|
|
13
|
+
setLinkedinUser,
|
|
14
|
+
setRedditUser
|
|
12
15
|
};
|
|
13
16
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport {
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/index.ts"],"sourcesContent":["export { sendGAEvent, setGAUser } from './google-analytics';\nexport { sendFBEvent, setFBUser } from './meta-pixel';\nexport { sendRedditEvent, setRedditUser } from './reddit-pixel';\nexport { sendLinkedinEvent, setLinkedinUser } from './linkedin-insight-tag';\n\nexport type { LinkedinConversionConfig } from './linkedin-insight-tag';\n"],"mappings":";AAAA,SAAS,aAAa,iBAAiB;AACvC,SAAS,aAAa,iBAAiB;AACvC,SAAS,iBAAiB,qBAAqB;AAC/C,SAAS,mBAAmB,uBAAuB;","names":[]}
|
|
@@ -20,13 +20,34 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/third-parties/linkedin-insight-tag.ts
|
|
21
21
|
var linkedin_insight_tag_exports = {};
|
|
22
22
|
__export(linkedin_insight_tag_exports, {
|
|
23
|
-
sendLinkedinEvent: () => sendLinkedinEvent
|
|
23
|
+
sendLinkedinEvent: () => sendLinkedinEvent,
|
|
24
|
+
setLinkedinUser: () => setLinkedinUser
|
|
24
25
|
});
|
|
25
26
|
module.exports = __toCommonJS(linkedin_insight_tag_exports);
|
|
26
|
-
|
|
27
|
+
var import_field = require("../utils/field.cjs");
|
|
28
|
+
function sendLinkedinEvent(config) {
|
|
29
|
+
return (name, _properties, event_id) => {
|
|
30
|
+
if (typeof window === "undefined" || !window.lintrk) {
|
|
31
|
+
console.warn("lintrk has not been initialized");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const conversion_id = config[name];
|
|
35
|
+
if (!conversion_id) return;
|
|
36
|
+
window.lintrk("track", { conversion_id, event_id });
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function setLinkedinUser({ data }) {
|
|
40
|
+
if (typeof window === "undefined" || !window.lintrk) {
|
|
41
|
+
console.warn("lintrk has not been initialized");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const email = (0, import_field.getFirst)(data == null ? void 0 : data.email);
|
|
45
|
+
if (!email) return;
|
|
46
|
+
window.lintrk("setUserData", { email });
|
|
27
47
|
}
|
|
28
48
|
// Annotate the CommonJS export names for ESM import in node:
|
|
29
49
|
0 && (module.exports = {
|
|
30
|
-
sendLinkedinEvent
|
|
50
|
+
sendLinkedinEvent,
|
|
51
|
+
setLinkedinUser
|
|
31
52
|
});
|
|
32
53
|
//# sourceMappingURL=linkedin-insight-tag.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/linkedin-insight-tag.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/linkedin-insight-tag.ts"],"sourcesContent":["import { getFirst } from '../utils/field';\nimport type { Lintrk } from '../track/lintrk';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends Lintrk {}\n}\n\n/**\n * LinkedIn Conversion Config:\n * example:\n * {\n * purchase: 123,\n * add_to_cart: 456,\n * add_to_wishlist: 789,\n * }\n */\nexport type LinkedinConversionConfig = Record<TrackName, number>;\n\nexport function sendLinkedinEvent(config: LinkedinConversionConfig) {\n return <T extends EventName>(\n name: TrackName<T>,\n _properties?: TrackProperties<T>,\n event_id?: string\n ) => {\n if (typeof window === 'undefined' || !window.lintrk) {\n console.warn('lintrk has not been initialized');\n return;\n }\n\n const conversion_id = config[name];\n if (!conversion_id) return;\n window.lintrk('track', { conversion_id, event_id });\n };\n}\n\nexport function setLinkedinUser({ data }: UpdateVisitorDTO) {\n if (typeof window === 'undefined' || !window.lintrk) {\n console.warn('lintrk has not been initialized');\n return;\n }\n\n const email = getFirst(data?.email);\n if (!email) return;\n window.lintrk('setUserData', { email });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAyB;AAoBlB,SAAS,kBAAkB,QAAkC;AAClE,SAAO,CACL,MACA,aACA,aACG;AACH,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,cAAQ,KAAK,iCAAiC;AAC9C;AAAA,IACF;AAEA,UAAM,gBAAgB,OAAO,IAAI;AACjC,QAAI,CAAC,cAAe;AACpB,WAAO,OAAO,SAAS,EAAE,eAAe,SAAS,CAAC;AAAA,EACpD;AACF;AAEO,SAAS,gBAAgB,EAAE,KAAK,GAAqB;AAC1D,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,YAAQ,KAAK,iCAAiC;AAC9C;AAAA,EACF;AAEA,QAAM,YAAQ,uBAAS,6BAAM,KAAK;AAClC,MAAI,CAAC,MAAO;AACZ,SAAO,OAAO,eAAe,EAAE,MAAM,CAAC;AACxC;","names":[]}
|
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
import { Lintrk } from '../track/lintrk.cjs';
|
|
2
|
+
import { TrackName, EventName, TrackProperties } from '../track/types.cjs';
|
|
3
|
+
import { UpdateVisitorDTO } from '../visitor/types.cjs';
|
|
4
|
+
import '../track/gtag.cjs';
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
declare global {
|
|
7
|
+
interface Window extends Lintrk {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* LinkedIn Conversion Config:
|
|
12
|
+
* example:
|
|
13
|
+
* {
|
|
14
|
+
* purchase: 123,
|
|
15
|
+
* add_to_cart: 456,
|
|
16
|
+
* add_to_wishlist: 789,
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
type LinkedinConversionConfig = Record<TrackName, number>;
|
|
20
|
+
declare function sendLinkedinEvent(config: LinkedinConversionConfig): <T extends EventName>(name: TrackName<T>, _properties?: TrackProperties<T>, event_id?: string) => void;
|
|
21
|
+
declare function setLinkedinUser({ data }: UpdateVisitorDTO): void;
|
|
22
|
+
|
|
23
|
+
export { type LinkedinConversionConfig, sendLinkedinEvent, setLinkedinUser };
|
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
import { Lintrk } from '../track/lintrk.js';
|
|
2
|
+
import { TrackName, EventName, TrackProperties } from '../track/types.js';
|
|
3
|
+
import { UpdateVisitorDTO } from '../visitor/types.js';
|
|
4
|
+
import '../track/gtag.js';
|
|
2
5
|
|
|
3
|
-
|
|
6
|
+
declare global {
|
|
7
|
+
interface Window extends Lintrk {
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* LinkedIn Conversion Config:
|
|
12
|
+
* example:
|
|
13
|
+
* {
|
|
14
|
+
* purchase: 123,
|
|
15
|
+
* add_to_cart: 456,
|
|
16
|
+
* add_to_wishlist: 789,
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
type LinkedinConversionConfig = Record<TrackName, number>;
|
|
20
|
+
declare function sendLinkedinEvent(config: LinkedinConversionConfig): <T extends EventName>(name: TrackName<T>, _properties?: TrackProperties<T>, event_id?: string) => void;
|
|
21
|
+
declare function setLinkedinUser({ data }: UpdateVisitorDTO): void;
|
|
22
|
+
|
|
23
|
+
export { type LinkedinConversionConfig, sendLinkedinEvent, setLinkedinUser };
|
|
@@ -1,7 +1,27 @@
|
|
|
1
1
|
// src/third-parties/linkedin-insight-tag.ts
|
|
2
|
-
|
|
2
|
+
import { getFirst } from "../utils/field.mjs";
|
|
3
|
+
function sendLinkedinEvent(config) {
|
|
4
|
+
return (name, _properties, event_id) => {
|
|
5
|
+
if (typeof window === "undefined" || !window.lintrk) {
|
|
6
|
+
console.warn("lintrk has not been initialized");
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const conversion_id = config[name];
|
|
10
|
+
if (!conversion_id) return;
|
|
11
|
+
window.lintrk("track", { conversion_id, event_id });
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function setLinkedinUser({ data }) {
|
|
15
|
+
if (typeof window === "undefined" || !window.lintrk) {
|
|
16
|
+
console.warn("lintrk has not been initialized");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const email = getFirst(data == null ? void 0 : data.email);
|
|
20
|
+
if (!email) return;
|
|
21
|
+
window.lintrk("setUserData", { email });
|
|
3
22
|
}
|
|
4
23
|
export {
|
|
5
|
-
sendLinkedinEvent
|
|
24
|
+
sendLinkedinEvent,
|
|
25
|
+
setLinkedinUser
|
|
6
26
|
};
|
|
7
27
|
//# sourceMappingURL=linkedin-insight-tag.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/linkedin-insight-tag.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/linkedin-insight-tag.ts"],"sourcesContent":["import { getFirst } from '../utils/field';\nimport type { Lintrk } from '../track/lintrk';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends Lintrk {}\n}\n\n/**\n * LinkedIn Conversion Config:\n * example:\n * {\n * purchase: 123,\n * add_to_cart: 456,\n * add_to_wishlist: 789,\n * }\n */\nexport type LinkedinConversionConfig = Record<TrackName, number>;\n\nexport function sendLinkedinEvent(config: LinkedinConversionConfig) {\n return <T extends EventName>(\n name: TrackName<T>,\n _properties?: TrackProperties<T>,\n event_id?: string\n ) => {\n if (typeof window === 'undefined' || !window.lintrk) {\n console.warn('lintrk has not been initialized');\n return;\n }\n\n const conversion_id = config[name];\n if (!conversion_id) return;\n window.lintrk('track', { conversion_id, event_id });\n };\n}\n\nexport function setLinkedinUser({ data }: UpdateVisitorDTO) {\n if (typeof window === 'undefined' || !window.lintrk) {\n console.warn('lintrk has not been initialized');\n return;\n }\n\n const email = getFirst(data?.email);\n if (!email) return;\n window.lintrk('setUserData', { email });\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAoBlB,SAAS,kBAAkB,QAAkC;AAClE,SAAO,CACL,MACA,aACA,aACG;AACH,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,cAAQ,KAAK,iCAAiC;AAC9C;AAAA,IACF;AAEA,UAAM,gBAAgB,OAAO,IAAI;AACjC,QAAI,CAAC,cAAe;AACpB,WAAO,OAAO,SAAS,EAAE,eAAe,SAAS,CAAC;AAAA,EACpD;AACF;AAEO,SAAS,gBAAgB,EAAE,KAAK,GAAqB;AAC1D,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ;AACnD,YAAQ,KAAK,iCAAiC;AAC9C;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,6BAAM,KAAK;AAClC,MAAI,CAAC,MAAO;AACZ,SAAO,OAAO,eAAe,EAAE,MAAM,CAAC;AACxC;","names":[]}
|
|
@@ -33,13 +33,12 @@ function sendFBEvent(name, properties, event_id) {
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
if (metrics.includes(name)) return;
|
|
36
|
-
const { fbq } = window;
|
|
37
36
|
const options = { eventID: event_id };
|
|
38
37
|
const [type, fbEventName, fbEventProperties] = (0, import_fbq.mapFBEvent)(name, properties);
|
|
39
38
|
if (type === "track") {
|
|
40
|
-
fbq(type, fbEventName, fbEventProperties, options);
|
|
39
|
+
window.fbq(type, fbEventName, fbEventProperties, options);
|
|
41
40
|
} else {
|
|
42
|
-
fbq(type, fbEventName, fbEventProperties, options);
|
|
41
|
+
window.fbq(type, fbEventName, fbEventProperties, options);
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
44
|
function setFBUser(pixelId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const options = { eventID: event_id };\n const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);\n if (type === 'track') {\n window.fbq(type, fbEventName, fbEventProperties, options);\n } else {\n window.fbq(type, fbEventName, fbEventProperties, options);\n }\n}\n\nexport function setFBUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n\n const address = getFirst(data?.address);\n\n window.fbq('init', pixelId, {\n em: getFirst(data?.email),\n fn: address?.first_name,\n ln: address?.last_name,\n ph: getFirst(data?.phone_number),\n external_id: user_id,\n ct: address?.city,\n st: address?.street,\n zp: address?.postal_code,\n country: address?.country,\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoC;AACpC,mBAAyB;AASzB,IAAM,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAEnD,SAAS,YACd,MACA,YACA,UACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,IAAI,EAAG;AAE5B,QAAM,UAAU,EAAE,SAAS,SAAS;AACpC,QAAM,CAAC,MAAM,aAAa,iBAAiB,QAAI,uBAAW,MAAM,UAAU;AAC1E,MAAI,SAAS,SAAS;AACpB,WAAO,IAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EAC1D,OAAO;AACL,WAAO,IAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EAC1D;AACF;AAEO,SAAS,UAAU,SAAkB;AAC1C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,UAAM,cAAU,uBAAS,6BAAM,OAAO;AAEtC,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,QAAI,uBAAS,6BAAM,KAAK;AAAA,MACxB,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,QAAI,uBAAS,6BAAM,YAAY;AAAA,MAC/B,aAAa;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,SAAS,mCAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -8,13 +8,12 @@ function sendFBEvent(name, properties, event_id) {
|
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
if (metrics.includes(name)) return;
|
|
11
|
-
const { fbq } = window;
|
|
12
11
|
const options = { eventID: event_id };
|
|
13
12
|
const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);
|
|
14
13
|
if (type === "track") {
|
|
15
|
-
fbq(type, fbEventName, fbEventProperties, options);
|
|
14
|
+
window.fbq(type, fbEventName, fbEventProperties, options);
|
|
16
15
|
} else {
|
|
17
|
-
fbq(type, fbEventName, fbEventProperties, options);
|
|
16
|
+
window.fbq(type, fbEventName, fbEventProperties, options);
|
|
18
17
|
}
|
|
19
18
|
}
|
|
20
19
|
function setFBUser(pixelId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/meta-pixel.ts"],"sourcesContent":["import { PixelId, mapFBEvent } from '../track/fbq';\nimport { getFirst } from '../utils/field';\nimport type { FBQ } from '../track/fbq';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends FBQ {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendFBEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n event_id?: string\n) {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const options = { eventID: event_id };\n const [type, fbEventName, fbEventProperties] = mapFBEvent(name, properties);\n if (type === 'track') {\n window.fbq(type, fbEventName, fbEventProperties, options);\n } else {\n window.fbq(type, fbEventName, fbEventProperties, options);\n }\n}\n\nexport function setFBUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (typeof window === 'undefined' || !window.fbq) {\n console.warn('fbq has not been initialized');\n return;\n }\n\n const address = getFirst(data?.address);\n\n window.fbq('init', pixelId, {\n em: getFirst(data?.email),\n fn: address?.first_name,\n ln: address?.last_name,\n ph: getFirst(data?.phone_number),\n external_id: user_id,\n ct: address?.city,\n st: address?.street,\n zp: address?.postal_code,\n country: address?.country,\n });\n };\n}\n"],"mappings":";AAAA,SAAkB,kBAAkB;AACpC,SAAS,gBAAgB;AASzB,IAAM,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAEnD,SAAS,YACd,MACA,YACA,UACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,IAAI,EAAG;AAE5B,QAAM,UAAU,EAAE,SAAS,SAAS;AACpC,QAAM,CAAC,MAAM,aAAa,iBAAiB,IAAI,WAAW,MAAM,UAAU;AAC1E,MAAI,SAAS,SAAS;AACpB,WAAO,IAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EAC1D,OAAO;AACL,WAAO,IAAI,MAAM,aAAa,mBAAmB,OAAO;AAAA,EAC1D;AACF;AAEO,SAAS,UAAU,SAAkB;AAC1C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,6BAAM,OAAO;AAEtC,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,IAAI,SAAS,6BAAM,KAAK;AAAA,MACxB,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,SAAS,6BAAM,YAAY;AAAA,MAC/B,aAAa;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,IAAI,mCAAS;AAAA,MACb,SAAS,mCAAS;AAAA,IACpB,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -20,28 +20,27 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/third-parties/reddit-pixel.ts
|
|
21
21
|
var reddit_pixel_exports = {};
|
|
22
22
|
__export(reddit_pixel_exports, {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
sendRedditEvent: () => sendRedditEvent,
|
|
24
|
+
setRedditUser: () => setRedditUser
|
|
25
25
|
});
|
|
26
26
|
module.exports = __toCommonJS(reddit_pixel_exports);
|
|
27
27
|
var import_rdt = require("../track/rdt.cjs");
|
|
28
28
|
var import_field = require("../utils/field.cjs");
|
|
29
29
|
var metrics = ["CLS", "FCP", "FID", "INP", "LCP", "TTFB"];
|
|
30
|
-
function
|
|
30
|
+
function sendRedditEvent(name, properties, eventId) {
|
|
31
31
|
if (typeof window === "undefined" || !window.rdt) {
|
|
32
32
|
console.warn("rdt has not been initialized");
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
if (metrics.includes(name)) return;
|
|
36
|
-
const { rdt } = window;
|
|
37
36
|
const [type, params] = (0, import_rdt.mapRDTEvent)(name, properties, eventId);
|
|
38
37
|
if (type === "Custom") {
|
|
39
|
-
rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
38
|
+
window.rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
40
39
|
} else {
|
|
41
|
-
rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
40
|
+
window.rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
42
41
|
}
|
|
43
42
|
}
|
|
44
|
-
function
|
|
43
|
+
function setRedditUser(pixelId) {
|
|
45
44
|
return ({ user_id, data }) => {
|
|
46
45
|
if (!window.rdt) {
|
|
47
46
|
console.warn("rdt has not been initialized");
|
|
@@ -56,7 +55,7 @@ function setRDTUser(pixelId) {
|
|
|
56
55
|
}
|
|
57
56
|
// Annotate the CommonJS export names for ESM import in node:
|
|
58
57
|
0 && (module.exports = {
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
sendRedditEvent,
|
|
59
|
+
setRedditUser
|
|
61
60
|
});
|
|
62
61
|
//# sourceMappingURL=reddit-pixel.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/reddit-pixel.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { PixelId, RDT } from '../track/rdt';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends RDT {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/reddit-pixel.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { PixelId, RDT } from '../track/rdt';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends RDT {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendRedditEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n eventId?: string\n) {\n if (typeof window === 'undefined' || !window.rdt) {\n console.warn('rdt has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const [type, params] = mapRDTEvent(name, properties, eventId);\n if (type === 'Custom') {\n window.rdt('track', type, JSON.parse(JSON.stringify(params)));\n } else {\n window.rdt('track', type, JSON.parse(JSON.stringify(params)));\n }\n}\n\nexport function setRedditUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (!window.rdt) {\n console.warn('rdt has not been initialized');\n return;\n }\n\n window.rdt('init', pixelId, {\n email: getFirst(data?.email),\n phoneNumber: getFirst(data?.phone_number),\n externalId: user_id,\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA4B;AAC5B,mBAAyB;AASzB,IAAM,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAEnD,SAAS,gBACd,MACA,YACA,SACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,IAAI,EAAG;AAE5B,QAAM,CAAC,MAAM,MAAM,QAAI,wBAAY,MAAM,YAAY,OAAO;AAC5D,MAAI,SAAS,UAAU;AACrB,WAAO,IAAI,SAAS,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,EAC9D,OAAO;AACL,WAAO,IAAI,SAAS,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,EAC9D;AACF;AAEO,SAAS,cAAc,SAAkB;AAC9C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,CAAC,OAAO,KAAK;AACf,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,WAAO,uBAAS,6BAAM,KAAK;AAAA,MAC3B,iBAAa,uBAAS,6BAAM,YAAY;AAAA,MACxC,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -7,7 +7,7 @@ declare global {
|
|
|
7
7
|
interface Window extends RDT {
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
declare function
|
|
11
|
-
declare function
|
|
10
|
+
declare function sendRedditEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>, eventId?: string): void;
|
|
11
|
+
declare function setRedditUser(pixelId: PixelId): ({ user_id, data }: UpdateVisitorDTO) => void;
|
|
12
12
|
|
|
13
|
-
export {
|
|
13
|
+
export { sendRedditEvent, setRedditUser };
|
|
@@ -7,7 +7,7 @@ declare global {
|
|
|
7
7
|
interface Window extends RDT {
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
-
declare function
|
|
11
|
-
declare function
|
|
10
|
+
declare function sendRedditEvent<T extends EventName>(name: TrackName<T>, properties?: TrackProperties<T>, eventId?: string): void;
|
|
11
|
+
declare function setRedditUser(pixelId: PixelId): ({ user_id, data }: UpdateVisitorDTO) => void;
|
|
12
12
|
|
|
13
|
-
export {
|
|
13
|
+
export { sendRedditEvent, setRedditUser };
|
|
@@ -2,21 +2,20 @@
|
|
|
2
2
|
import { mapRDTEvent } from "../track/rdt.mjs";
|
|
3
3
|
import { getFirst } from "../utils/field.mjs";
|
|
4
4
|
var metrics = ["CLS", "FCP", "FID", "INP", "LCP", "TTFB"];
|
|
5
|
-
function
|
|
5
|
+
function sendRedditEvent(name, properties, eventId) {
|
|
6
6
|
if (typeof window === "undefined" || !window.rdt) {
|
|
7
7
|
console.warn("rdt has not been initialized");
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
if (metrics.includes(name)) return;
|
|
11
|
-
const { rdt } = window;
|
|
12
11
|
const [type, params] = mapRDTEvent(name, properties, eventId);
|
|
13
12
|
if (type === "Custom") {
|
|
14
|
-
rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
13
|
+
window.rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
15
14
|
} else {
|
|
16
|
-
rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
15
|
+
window.rdt("track", type, JSON.parse(JSON.stringify(params)));
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
|
-
function
|
|
18
|
+
function setRedditUser(pixelId) {
|
|
20
19
|
return ({ user_id, data }) => {
|
|
21
20
|
if (!window.rdt) {
|
|
22
21
|
console.warn("rdt has not been initialized");
|
|
@@ -30,7 +29,7 @@ function setRDTUser(pixelId) {
|
|
|
30
29
|
};
|
|
31
30
|
}
|
|
32
31
|
export {
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
sendRedditEvent,
|
|
33
|
+
setRedditUser
|
|
35
34
|
};
|
|
36
35
|
//# sourceMappingURL=reddit-pixel.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/third-parties/reddit-pixel.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { PixelId, RDT } from '../track/rdt';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends RDT {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function
|
|
1
|
+
{"version":3,"sources":["../../src/third-parties/reddit-pixel.ts"],"sourcesContent":["import { mapRDTEvent } from '../track/rdt';\nimport { getFirst } from '../utils/field';\nimport type { PixelId, RDT } from '../track/rdt';\nimport type { EventName, TrackName, TrackProperties } from '../track/types';\nimport type { UpdateVisitorDTO } from '../visitor/types';\n\ndeclare global {\n interface Window extends RDT {}\n}\n\nconst metrics = ['CLS', 'FCP', 'FID', 'INP', 'LCP', 'TTFB'];\n\nexport function sendRedditEvent<T extends EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n eventId?: string\n) {\n if (typeof window === 'undefined' || !window.rdt) {\n console.warn('rdt has not been initialized');\n return;\n }\n if (metrics.includes(name)) return;\n\n const [type, params] = mapRDTEvent(name, properties, eventId);\n if (type === 'Custom') {\n window.rdt('track', type, JSON.parse(JSON.stringify(params)));\n } else {\n window.rdt('track', type, JSON.parse(JSON.stringify(params)));\n }\n}\n\nexport function setRedditUser(pixelId: PixelId) {\n return ({ user_id, data }: UpdateVisitorDTO) => {\n if (!window.rdt) {\n console.warn('rdt has not been initialized');\n return;\n }\n\n window.rdt('init', pixelId, {\n email: getFirst(data?.email),\n phoneNumber: getFirst(data?.phone_number),\n externalId: user_id,\n });\n };\n}\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AASzB,IAAM,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAEnD,SAAS,gBACd,MACA,YACA,SACA;AACA,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,KAAK;AAChD,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,IAAI,EAAG;AAE5B,QAAM,CAAC,MAAM,MAAM,IAAI,YAAY,MAAM,YAAY,OAAO;AAC5D,MAAI,SAAS,UAAU;AACrB,WAAO,IAAI,SAAS,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,EAC9D,OAAO;AACL,WAAO,IAAI,SAAS,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,EAC9D;AACF;AAEO,SAAS,cAAc,SAAkB;AAC9C,SAAO,CAAC,EAAE,SAAS,KAAK,MAAwB;AAC9C,QAAI,CAAC,OAAO,KAAK;AACf,cAAQ,KAAK,8BAA8B;AAC3C;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,SAAS;AAAA,MAC1B,OAAO,SAAS,6BAAM,KAAK;AAAA,MAC3B,aAAa,SAAS,6BAAM,YAAY;AAAA,MACxC,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/track/lintrk.ts"],"sourcesContent":["export interface Lintrk {\n lintrk(event: 'track', params: { conversion_id: number; event_id?: string }): void;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/track/lintrk.ts"],"sourcesContent":["export interface Lintrk {\n lintrk(event: 'track', params: { conversion_id: number; event_id?: string }): void;\n\n /** reference: https://www.linkedin.com/help/lms/answer/a6246095 */\n lintrk(event: 'setUserData', params: { email: string }): void;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
package/dist/track/lintrk.d.cts
CHANGED
package/dist/track/lintrk.d.ts
CHANGED
package/dist/track/types.cjs.map
CHANGED
|
@@ -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?: string;\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 // click ids\n dclid?: string; // Google Display Network\n ko_click_id?: string; // Kakao Ads\n
|
|
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?: string;\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 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;\n name: TrackName<T>;\n tags: TrackTags;\n visitor_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":[]}
|
package/dist/track/types.d.cts
CHANGED
|
@@ -92,9 +92,10 @@ interface AdvertisingInfo {
|
|
|
92
92
|
/** Reddit Ads fields */
|
|
93
93
|
rdt_cid?: string;
|
|
94
94
|
rdt_uuid?: string;
|
|
95
|
+
/** LinkedIn Ads fields: get click id from url params or first-party cookie */
|
|
96
|
+
li_fat_id?: string;
|
|
95
97
|
dclid?: string;
|
|
96
98
|
ko_click_id?: string;
|
|
97
|
-
li_fat_id?: string;
|
|
98
99
|
msclkid?: string;
|
|
99
100
|
sccid?: string;
|
|
100
101
|
ttclid?: string;
|
package/dist/track/types.d.ts
CHANGED
|
@@ -92,9 +92,10 @@ interface AdvertisingInfo {
|
|
|
92
92
|
/** Reddit Ads fields */
|
|
93
93
|
rdt_cid?: string;
|
|
94
94
|
rdt_uuid?: string;
|
|
95
|
+
/** LinkedIn Ads fields: get click id from url params or first-party cookie */
|
|
96
|
+
li_fat_id?: string;
|
|
95
97
|
dclid?: string;
|
|
96
98
|
ko_click_id?: string;
|
|
97
|
-
li_fat_id?: string;
|
|
98
99
|
msclkid?: string;
|
|
99
100
|
sccid?: string;
|
|
100
101
|
ttclid?: string;
|
package/dist/web/index.cjs
CHANGED
|
@@ -97,10 +97,11 @@ async function getTags(release) {
|
|
|
97
97
|
// reddit ads
|
|
98
98
|
rdt_cid: params.get("rdt_cid") ?? void 0,
|
|
99
99
|
rdt_uuid: parsed._rdt_uuid,
|
|
100
|
+
// linkedin ads: get click id from url params or first-party cookie
|
|
101
|
+
li_fat_id: params.get("li_fat_id") ?? parsed.li_fat_id ?? void 0,
|
|
100
102
|
// click ids
|
|
101
103
|
dclid: params.get("dclid") ?? void 0,
|
|
102
104
|
ko_click_id: params.get("ko_click_id") ?? void 0,
|
|
103
|
-
li_fat_id: params.get("li_fat_id") ?? void 0,
|
|
104
105
|
msclkid: params.get("msclkid") ?? void 0,
|
|
105
106
|
sccid: params.get("sccid") ?? void 0,
|
|
106
107
|
ttclid: params.get("ttclid") ?? void 0,
|
package/dist/web/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport * as cookie from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags(release: string) {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = cookie.parse(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: `${window.devicePixelRatio}`,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid: params.get('rdt_cid') ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // click
|
|
1
|
+
{"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport * as cookie from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags(release: string) {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = cookie.parse(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: `${window.devicePixelRatio}`,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid: params.get('rdt_cid') ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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","names":["uuidv4","Bowser"]}
|
package/dist/web/index.mjs
CHANGED
|
@@ -61,10 +61,11 @@ async function getTags(release) {
|
|
|
61
61
|
// reddit ads
|
|
62
62
|
rdt_cid: params.get("rdt_cid") ?? void 0,
|
|
63
63
|
rdt_uuid: parsed._rdt_uuid,
|
|
64
|
+
// linkedin ads: get click id from url params or first-party cookie
|
|
65
|
+
li_fat_id: params.get("li_fat_id") ?? parsed.li_fat_id ?? void 0,
|
|
64
66
|
// click ids
|
|
65
67
|
dclid: params.get("dclid") ?? void 0,
|
|
66
68
|
ko_click_id: params.get("ko_click_id") ?? void 0,
|
|
67
|
-
li_fat_id: params.get("li_fat_id") ?? void 0,
|
|
68
69
|
msclkid: params.get("msclkid") ?? void 0,
|
|
69
70
|
sccid: params.get("sccid") ?? void 0,
|
|
70
71
|
ttclid: params.get("ttclid") ?? void 0,
|
package/dist/web/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport * as cookie from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags(release: string) {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = cookie.parse(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: `${window.devicePixelRatio}`,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid: params.get('rdt_cid') ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // click
|
|
1
|
+
{"version":3,"sources":["../../src/web/index.ts"],"sourcesContent":["import Bowser from 'bowser';\nimport * as cookie from 'cookie';\nimport { v4 as uuidv4 } from 'uuid';\nimport { type Link, getLink } from '../link/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nexport function getDeviceId() {\n const cached = localStorage.getItem('device_id');\n if (cached) return cached;\n const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();\n localStorage.setItem('device_id', id);\n return id;\n}\n\nexport async function getTags(release: string) {\n const parser = Bowser.getParser(window.navigator.userAgent);\n const params = new URLSearchParams(window.location.search);\n const os = parser.getOS();\n const browser = parser.getBrowser();\n const platform = parser.getPlatform();\n const parsed = cookie.parse(document.cookie);\n\n let link: Link | null = null;\n if (params.has('s')) link = await getLink(params.get('s')!);\n\n const tags: TrackTags = {\n os: `${os.name} ${os.version}`,\n os_name: os.name,\n os_version: os.version,\n browser: `${browser.name} ${browser.version}`,\n browser_name: browser.name,\n browser_version: browser.version,\n platform: 'web',\n device: platform.model,\n device_id: getDeviceId(),\n device_type: platform.type,\n device_vendor: platform.vendor,\n device_pixel_ratio: `${window.devicePixelRatio}`,\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n screen_resolution: `${window.screen.width}x${window.screen.height}`,\n release,\n language: navigator.language,\n time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n environment: process.env.NODE_ENV === 'development' ? 'development' : 'production',\n source: 'web',\n source_url: window.location.origin + window.location.pathname,\n // meta ads\n fbc: parsed._fbc,\n fbp: parsed._fbp,\n fbclid: params.get('fbclid') ?? undefined,\n ad_id: params.get('ad_id') ?? undefined,\n ad_name: params.get('ad_name') ?? undefined,\n adset_id: params.get('adset_id') ?? undefined,\n adset_name: params.get('adset_name') ?? undefined,\n campaign_id: params.get('campaign_id') ?? undefined,\n campaign_name: params.get('campaign_name') ?? undefined,\n placement: params.get('placement') ?? undefined,\n site_source_name: params.get('site_source_name') ?? undefined,\n // google ads\n gclid: params.get('gclid') ?? undefined,\n gclsrc: params.get('gclsrc') ?? undefined,\n gad_source: params.get('gad_source') ?? undefined,\n gad_campaignid: params.get('gad_campaignid') ?? undefined,\n // reddit ads\n rdt_cid: params.get('rdt_cid') ?? undefined,\n rdt_uuid: parsed._rdt_uuid,\n // linkedin ads: get click id from url params or first-party cookie\n li_fat_id: params.get('li_fat_id') ?? parsed.li_fat_id ?? undefined,\n // click ids\n dclid: params.get('dclid') ?? undefined,\n ko_click_id: params.get('ko_click_id') ?? undefined,\n msclkid: params.get('msclkid') ?? undefined,\n sccid: params.get('sccid') ?? undefined,\n ttclid: params.get('ttclid') ?? undefined,\n twclid: params.get('twclid') ?? undefined,\n wbraid: params.get('wbraid') ?? undefined,\n yclid: params.get('yclid') ?? undefined,\n // utm params\n utm_source: link?.utm_source ?? params.get('utm_source') ?? undefined,\n utm_medium: link?.utm_medium ?? params.get('utm_medium') ?? undefined,\n utm_campaign: link?.utm_campaign ?? params.get('utm_campaign') ?? undefined,\n utm_term: link?.utm_term ?? params.get('utm_term') ?? undefined,\n utm_content: link?.utm_content ?? params.get('utm_content') ?? undefined,\n utm_id: link?.utm_id ?? params.get('utm_id') ?? undefined,\n utm_source_platform:\n link?.utm_source_platform ?? params.get('utm_source_platform') ?? undefined,\n utm_creative_format:\n link?.utm_creative_format ?? params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic:\n link?.utm_marketing_tactic ?? params.get('utm_marketing_tactic') ?? undefined,\n };\n return tags;\n}\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n"],"mappings":"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","names":[]}
|