@azzas/azzas-tracker-web 1.0.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.
- package/README.md +109 -0
- package/dist/mod.cjs +389 -0
- package/dist/mod.cjs.map +1 -0
- package/dist/mod.d.cts +79 -0
- package/dist/mod.d.ts +79 -0
- package/dist/mod.global.js +387 -0
- package/dist/mod.global.js.map +1 -0
- package/dist/mod.js +362 -0
- package/dist/mod.js.map +1 -0
- package/package.json +36 -0
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# azzas-tracker-web
|
|
2
|
+
|
|
3
|
+
Pacote interno para **Data Tracking** das lojas WEB, centralizando a captura e envio de eventos para diferentes plataformas de mídia (Meta, Dito, DataLayer, etc).
|
|
4
|
+
|
|
5
|
+
O objetivo é fornecer uma **camada única e consistente de tracking**, garantindo que todos os eventos sejam tratados, formatados e enviados de forma confiável.
|
|
6
|
+
|
|
7
|
+
E, principalmente, centralizar a complexidade e a “inteligência” de tracking **fora dos repositórios das lojas**.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Fluxo do Tracking
|
|
12
|
+
|
|
13
|
+
O pacote segue o seguinte fluxo de eventos:
|
|
14
|
+
|
|
15
|
+
1. **User Action**
|
|
16
|
+
Ações do usuário na loja (ex: adicionar ao carrinho, iniciar checkout, finalizar compra).
|
|
17
|
+
|
|
18
|
+
2. **Tracks**
|
|
19
|
+
Ponto central que recebe o contexto do evento vindo da ação do usuário e encaminha para o *Formatter*.
|
|
20
|
+
|
|
21
|
+
3. **Formatter**
|
|
22
|
+
Acessa a constante `EVENTS` e, baseado no contexto do evento, puxa os parâmetros obrigatórios e entrega a biblioteca de parâmetros (`/params`).
|
|
23
|
+
|
|
24
|
+
4. **Params Library**
|
|
25
|
+
Contém **getters** e **resolvers** que garantem que os dados sejam legítimos e que todos os parâmetros sejam corretamente tratados.
|
|
26
|
+
|
|
27
|
+
5. **Adapters**
|
|
28
|
+
Módulos responsáveis por enviar os dados formatados para cada destino (Meta, Datalayer, Dito, etc).
|
|
29
|
+
|
|
30
|
+

|
|
31
|
+
|
|
32
|
+
## Instalação
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install /path/azzas-tracker-web
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
## Exemplos
|
|
41
|
+
|
|
42
|
+
Listagem dos `EVENTS` e função orquestradora `trackWebEvent`:
|
|
43
|
+
```javascript
|
|
44
|
+
const EVENTS = {
|
|
45
|
+
ADD_PERSONAL_INFO: {
|
|
46
|
+
name: 'add_personal_info',
|
|
47
|
+
destinations: ['DataLayer'],
|
|
48
|
+
requiredParams: ['brand', 'pre_filled', 'currency', 'value', 'subtotal'],
|
|
49
|
+
},
|
|
50
|
+
VIEW_CART: {
|
|
51
|
+
name: 'add_personal_info',
|
|
52
|
+
destinations: ['DataLayer', 'Meta', 'Dito'],
|
|
53
|
+
requiredParams: ['....'],
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function trackWebEvent(event: EventName, context: EventContext = {}) {
|
|
58
|
+
try {
|
|
59
|
+
const parameters = await getParameters(context, event);
|
|
60
|
+
return await dispatchTrackEvent(event, parameters);
|
|
61
|
+
} catch (err) {
|
|
62
|
+
return console.error(`[DT] Error tracking event ${event}:`, err);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Uso básico da função no consumidor:
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
import { trackWebEvent } from 'azzas-tracker-web';
|
|
72
|
+
|
|
73
|
+
// DATA TRACKING | add_personal_info at submit (pre-filled always false)
|
|
74
|
+
// @see notion document for more details:
|
|
75
|
+
const form: Element = document.querySelector('xxxxxx');
|
|
76
|
+
if (form) {
|
|
77
|
+
form.addEventListener('submit', () => {
|
|
78
|
+
trackWebEvent('ADD_PERSONAL_INFO', { preFilled: false, orderForm: vtexjs.checkout.orderForm });
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
***OBS***: atente-se ao adicionar eventos novos e contribua na documentação do NOTION ou apenas DOCUMENTE em algum lugar! Seu futuro EU será grato 👍
|
|
84
|
+
|
|
85
|
+
## Boas Práticas
|
|
86
|
+
- Sempre garantir que os `requiredParams` de cada evento estejam preenchidos antes de enviar.
|
|
87
|
+
|
|
88
|
+
- Procure sempre manter o envio das ações de usuário o mais ***genérico*** possível. Toda a inteligência e complexidade do tratamento dos dados deve ficar centralizada na lib, e não nos repositórios das lojas.
|
|
89
|
+
|
|
90
|
+
- Usar nomes de eventos semânticos e consistentes (ex: VIEW_CART, ADD_PAYMENT_INFO).
|
|
91
|
+
|
|
92
|
+
- Manter os contextos enxutos, enviando apenas dados realmente necessários.
|
|
93
|
+
|
|
94
|
+
- Cada novo evento deve ser registrado em `EVENTS` com seus destinos e parâmetros obrigatórios. Essa constante talvez venha a ser dinâmica dependendo da MARCA utilizada
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
## Contribuição
|
|
98
|
+
|
|
99
|
+
- Adicionar novos eventos em `EVENTS`.
|
|
100
|
+
|
|
101
|
+
- Criar adapter correspondente caso seja necessário integrar com nova plataforma. Nesse caso deve-se avaliar qual será o serviço feito, o que será consumido, para onde será enviado.
|
|
102
|
+
|
|
103
|
+
- Garantir que todos os parâmetros obrigatórios estejam mapeados nos getters/resolvers.
|
|
104
|
+
|
|
105
|
+
- Executar build (npm run build) antes de testar no checkout/loja.
|
|
106
|
+
|
|
107
|
+
## Authors
|
|
108
|
+
|
|
109
|
+
- Lucas Soares
|
package/dist/mod.cjs
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
trackWebEvent: () => trackWebEvent
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(src_exports);
|
|
26
|
+
|
|
27
|
+
// src/constants.ts
|
|
28
|
+
var EVENTS = {
|
|
29
|
+
VIEW_CART: {
|
|
30
|
+
name: "view_cart",
|
|
31
|
+
destinations: ["Dito", "DataLayer"],
|
|
32
|
+
requiredParams: [
|
|
33
|
+
"brand",
|
|
34
|
+
"region",
|
|
35
|
+
"line_items",
|
|
36
|
+
"currency",
|
|
37
|
+
"value",
|
|
38
|
+
"total_discount",
|
|
39
|
+
"subtotal",
|
|
40
|
+
"items"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
ADD_TO_CART: {
|
|
44
|
+
name: "add_to_cart",
|
|
45
|
+
destinations: ["DataLayer"],
|
|
46
|
+
requiredParams: [
|
|
47
|
+
"brand",
|
|
48
|
+
"region",
|
|
49
|
+
"line_items",
|
|
50
|
+
"currency",
|
|
51
|
+
"value",
|
|
52
|
+
"items"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
REMOVE_FROM_CART: {
|
|
56
|
+
name: "remove_from_cart",
|
|
57
|
+
destinations: ["DataLayer"],
|
|
58
|
+
requiredParams: [
|
|
59
|
+
"brand",
|
|
60
|
+
"region",
|
|
61
|
+
"line_items",
|
|
62
|
+
"currency",
|
|
63
|
+
"value",
|
|
64
|
+
"items"
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
ADD_COUPON: {
|
|
68
|
+
name: "add_coupon",
|
|
69
|
+
destinations: ["DataLayer"],
|
|
70
|
+
requiredParams: [
|
|
71
|
+
"brand",
|
|
72
|
+
"region",
|
|
73
|
+
"coupon",
|
|
74
|
+
"coupon_message",
|
|
75
|
+
"seller_cod_name"
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
SEARCH: {
|
|
79
|
+
name: "search",
|
|
80
|
+
destinations: ["DataLayer"],
|
|
81
|
+
requiredParams: ["brand", "search_term", "search_found", "search_quantity"]
|
|
82
|
+
},
|
|
83
|
+
SEARCH_ZIPCODE: {
|
|
84
|
+
name: "search_zipcode",
|
|
85
|
+
requiredParams: ["region"]
|
|
86
|
+
},
|
|
87
|
+
SELECT_CONTENT: {
|
|
88
|
+
name: "select_content",
|
|
89
|
+
requiredParams: ["region"]
|
|
90
|
+
},
|
|
91
|
+
SELECT_ITEM: {
|
|
92
|
+
name: "select_item",
|
|
93
|
+
requiredParams: ["region"]
|
|
94
|
+
},
|
|
95
|
+
VIEW_ITEM_LIST: {
|
|
96
|
+
name: "view_item_list",
|
|
97
|
+
requiredParams: ["region"]
|
|
98
|
+
},
|
|
99
|
+
BEGIN_CHECKOUT: {
|
|
100
|
+
name: "begin_checkout",
|
|
101
|
+
requiredParams: ["region"]
|
|
102
|
+
},
|
|
103
|
+
AUTH_ACTION: {
|
|
104
|
+
name: "auth_action",
|
|
105
|
+
requiredParams: ["region"]
|
|
106
|
+
},
|
|
107
|
+
ADD_PERSONAL_INFO: {
|
|
108
|
+
name: "add_personal_info",
|
|
109
|
+
destinations: ["DataLayer"],
|
|
110
|
+
requiredParams: ["brand", "pre_filled", "line_items", "currency", "value", "total_discount", "subtotal"]
|
|
111
|
+
},
|
|
112
|
+
ADD_SHIPPING_INFO: {
|
|
113
|
+
name: "add_shipping_info",
|
|
114
|
+
requiredParams: ["region"]
|
|
115
|
+
},
|
|
116
|
+
ADD_PAYMENT_INFO: {
|
|
117
|
+
name: "add_payment_info",
|
|
118
|
+
requiredParams: ["region"]
|
|
119
|
+
},
|
|
120
|
+
ORDER_REVIWED: {
|
|
121
|
+
name: "order_reviewed",
|
|
122
|
+
requiredParams: ["region"]
|
|
123
|
+
},
|
|
124
|
+
PURCHASE: {
|
|
125
|
+
name: "purchase",
|
|
126
|
+
requiredParams: ["region"]
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// src/adapters/index.ts
|
|
131
|
+
function dataTrackingLog(data, color, destination) {
|
|
132
|
+
console.log(
|
|
133
|
+
`%c[${destination}] EVENTO DISPARADO:%c `,
|
|
134
|
+
`background: ${color}; color: white; font-weight: bold; padding: 2px 4px; border-radius: 3px;`,
|
|
135
|
+
"color: #fff;",
|
|
136
|
+
data || ""
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
function pushToDataLayer(event, ecomm, dest) {
|
|
140
|
+
dataTrackingLog({ event, ecommerce: ecomm }, "#0b5fff", dest);
|
|
141
|
+
}
|
|
142
|
+
function pushToMeta(event, ecomm, dest) {
|
|
143
|
+
dataTrackingLog({ eventName: event, data: ecomm }, "#8C1007", dest);
|
|
144
|
+
}
|
|
145
|
+
function pushToDito(event, ecomm, dest) {
|
|
146
|
+
dataTrackingLog({ id: event, custom_data: ecomm }, "#00c851", dest);
|
|
147
|
+
}
|
|
148
|
+
var adapters = {
|
|
149
|
+
Meta: pushToMeta,
|
|
150
|
+
DataLayer: pushToDataLayer,
|
|
151
|
+
Dito: pushToDito
|
|
152
|
+
};
|
|
153
|
+
async function dispatchTrackEvent(eventName, data) {
|
|
154
|
+
const eventConfig = EVENTS[eventName];
|
|
155
|
+
if (!eventConfig) return;
|
|
156
|
+
await Promise.allSettled(
|
|
157
|
+
eventConfig.destinations.map(async (dest) => {
|
|
158
|
+
try {
|
|
159
|
+
await adapters[dest](eventName.toLowerCase(), data, dest);
|
|
160
|
+
} catch (err) {
|
|
161
|
+
console.error(`[DT] Failed to send ${eventName} to ${dest}:`, err);
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// src/params/utils/index.ts
|
|
168
|
+
async function getProductDataById(id) {
|
|
169
|
+
try {
|
|
170
|
+
const response = await fetch(
|
|
171
|
+
`/api/catalog_system/pub/products/search?fq=productId:${id}`
|
|
172
|
+
);
|
|
173
|
+
return await response.json();
|
|
174
|
+
} catch (e) {
|
|
175
|
+
console.log("[DT] Erro ao buscar dados do produto", e);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function getItemShippingTier(orderForm, item) {
|
|
179
|
+
const info = orderForm?.shippingData?.logisticsInfo?.find(
|
|
180
|
+
(li) => li.itemId === item.id
|
|
181
|
+
);
|
|
182
|
+
const selectedSla = info?.slas?.find((sla) => sla.id === info.selectedSla);
|
|
183
|
+
return selectedSla?.pickupStoreInfo?.friendlyName ? `retirada em loja: ${selectedSla.pickupStoreInfo.friendlyName}` : selectedSla?.name ? `Receba em casa: ${selectedSla.name}` : null;
|
|
184
|
+
}
|
|
185
|
+
async function getItemSku(item) {
|
|
186
|
+
const product = await getProductDataById(item.productId);
|
|
187
|
+
if (!product.length) return null;
|
|
188
|
+
return product[0].items.find((i) => i.name === item.skuName)?.itemId ?? null;
|
|
189
|
+
}
|
|
190
|
+
function getDiscount(item) {
|
|
191
|
+
return parseFloat(Math.max(item.listPrice - item.sellingPrice, 0).toFixed(2)) || 0;
|
|
192
|
+
}
|
|
193
|
+
function getItemCategory(item) {
|
|
194
|
+
return "sale";
|
|
195
|
+
}
|
|
196
|
+
function getItemCategory2(item) {
|
|
197
|
+
return "sale2";
|
|
198
|
+
}
|
|
199
|
+
function getItemCategory4(item) {
|
|
200
|
+
const tags = item?.additionalInfo?.tags || item?.tags;
|
|
201
|
+
return Array.isArray(tags) && tags.length ? tags.join(",") : null;
|
|
202
|
+
}
|
|
203
|
+
var brandMap = { Farm: "farmrio", "Farm Etc": "farmetc" };
|
|
204
|
+
function normalizeBrand(input) {
|
|
205
|
+
if (typeof input === "string") {
|
|
206
|
+
return brandMap[input] || null;
|
|
207
|
+
}
|
|
208
|
+
if (Array.isArray(input)) {
|
|
209
|
+
const uniqueBrands = new Set(
|
|
210
|
+
input.map((i) => brandMap[i.additionalInfo?.brandName || i.brand])
|
|
211
|
+
);
|
|
212
|
+
return uniqueBrands.size ? [...uniqueBrands].join("_") : null;
|
|
213
|
+
}
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// src/params/resolvers/brand/fromOrderForm.ts
|
|
218
|
+
function brandFromOrderForm(context) {
|
|
219
|
+
if (!context.orderForm && !context.orderForm.items?.length) return null;
|
|
220
|
+
const items = context.orderForm.items;
|
|
221
|
+
return normalizeBrand(items);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// src/params/resolvers/brand/fromItem.ts
|
|
225
|
+
function brandFromItem(context) {
|
|
226
|
+
const { item } = context;
|
|
227
|
+
return normalizeBrand(item.additionalInfo?.brandName || item.brand);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// src/params/brand.ts
|
|
231
|
+
function getBrand(context, eventName) {
|
|
232
|
+
if (context?.brand) return context.brand;
|
|
233
|
+
switch (eventName) {
|
|
234
|
+
case "VIEW_CART":
|
|
235
|
+
case "ADD_COUPON":
|
|
236
|
+
case "ADD_PERSONAL_INFO":
|
|
237
|
+
return brandFromOrderForm(context);
|
|
238
|
+
case "ADD_TO_CART":
|
|
239
|
+
case "REMOVE_FROM_CART":
|
|
240
|
+
return brandFromItem(context);
|
|
241
|
+
default:
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// src/params/resolvers/items/fromOrderForm.ts
|
|
247
|
+
async function itemsFromOrderForm(context) {
|
|
248
|
+
const items = context.orderForm?.items || [];
|
|
249
|
+
if (!items.length) return [];
|
|
250
|
+
return await Promise.all(
|
|
251
|
+
items.map(async (item) => ({
|
|
252
|
+
item_id: item.productId,
|
|
253
|
+
item_category2: getItemCategory2(item),
|
|
254
|
+
item_category4: getItemCategory4(item),
|
|
255
|
+
item_shipping_tier: getItemShippingTier(context.orderForm, item),
|
|
256
|
+
price: parseFloat((item.price / 100).toFixed(2)) || 0,
|
|
257
|
+
quantity: item.quantity || 1,
|
|
258
|
+
item_ref: item.refId || null,
|
|
259
|
+
item_brand: normalizeBrand(item.additionalInfo?.brandName) || null,
|
|
260
|
+
item_sku: await getItemSku(item) || item.id || null,
|
|
261
|
+
item_name: item.name || item.id || null,
|
|
262
|
+
item_category: getItemCategory(item) || null,
|
|
263
|
+
item_variant: item.skuName.split("-")[0].trim(),
|
|
264
|
+
item_variant2: item.skuName.split("-")[1]?.trim() || "",
|
|
265
|
+
discount: getDiscount(item)
|
|
266
|
+
}))
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// src/params/resolvers/items/fromItem.ts
|
|
271
|
+
async function itemsFromItem(context) {
|
|
272
|
+
const { item, orderForm } = context;
|
|
273
|
+
return [
|
|
274
|
+
{
|
|
275
|
+
item_id: item.productId,
|
|
276
|
+
item_category2: getItemCategory2(item),
|
|
277
|
+
item_category4: getItemCategory4(item),
|
|
278
|
+
item_shipping_tier: getItemShippingTier(orderForm, item),
|
|
279
|
+
price: parseFloat((item.price / 100).toFixed(2)) || 0,
|
|
280
|
+
quantity: 1,
|
|
281
|
+
item_ref: item.refId || null,
|
|
282
|
+
item_brand: item.additionalInfo?.brandName || null,
|
|
283
|
+
item_sku: await getItemSku(item) || item.id || null,
|
|
284
|
+
item_name: item.name || item.id || null,
|
|
285
|
+
item_category: getItemCategory(item) || null,
|
|
286
|
+
item_variant: item.skuName.split("-")[0].trim(),
|
|
287
|
+
item_variant2: item.skuName.split("-")[1]?.trim() || "",
|
|
288
|
+
discount: getDiscount(item)
|
|
289
|
+
}
|
|
290
|
+
];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// src/params/items.ts
|
|
294
|
+
function getItems(context, eventName) {
|
|
295
|
+
switch (eventName) {
|
|
296
|
+
case "VIEW_CART":
|
|
297
|
+
return itemsFromOrderForm(context);
|
|
298
|
+
case "ADD_TO_CART":
|
|
299
|
+
case "REMOVE_FROM_CART":
|
|
300
|
+
return itemsFromItem(context);
|
|
301
|
+
default:
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// src/params/index.ts
|
|
307
|
+
var paramGetters = {
|
|
308
|
+
brand: getBrand,
|
|
309
|
+
region: (context, eventName) => {
|
|
310
|
+
return context.region || null;
|
|
311
|
+
},
|
|
312
|
+
line_items: (context, eventName) => {
|
|
313
|
+
return (context.orderForm.items || []).map((item) => item.productId).join(",");
|
|
314
|
+
},
|
|
315
|
+
currency: (context, eventName) => {
|
|
316
|
+
return context.orderForm?.storePreferencesData?.currencyCode || null;
|
|
317
|
+
},
|
|
318
|
+
value: (context, eventName) => {
|
|
319
|
+
return context.item ? context.item.price : context.orderForm?.value != null ? context.orderForm.value / 100 : null;
|
|
320
|
+
},
|
|
321
|
+
total_discount: (context, eventName) => {
|
|
322
|
+
return context.orderForm?.totalizers?.filter((t) => t.id === "Discounts").reduce((acc, t) => acc + t.value, 0) / 100 || 0;
|
|
323
|
+
},
|
|
324
|
+
subtotal: (context, eventName) => {
|
|
325
|
+
return context.orderForm?.totalizers?.filter((t) => t.id === "Items").reduce((acc, t) => acc + t.value, 0) / 100 || 0;
|
|
326
|
+
},
|
|
327
|
+
coupon_message: (context, eventName) => {
|
|
328
|
+
const messages = context.orderForm?.messages || [];
|
|
329
|
+
if (messages.length === 0) return null;
|
|
330
|
+
const couponMessages = messages.filter(
|
|
331
|
+
(msg) => msg.text.toLowerCase().includes("cupom")
|
|
332
|
+
);
|
|
333
|
+
if (couponMessages.length === 0) return null;
|
|
334
|
+
return couponMessages.map((msg) => msg.text).join(" | ");
|
|
335
|
+
},
|
|
336
|
+
seller_cod_name: (context, eventName) => {
|
|
337
|
+
return context.appliedSellerCodName || null;
|
|
338
|
+
},
|
|
339
|
+
coupon: (context, eventName) => {
|
|
340
|
+
return context.appliedCoupon || null;
|
|
341
|
+
},
|
|
342
|
+
pre_filled: (context, eventName) => {
|
|
343
|
+
return !!context.preFilled;
|
|
344
|
+
},
|
|
345
|
+
search_term: (context, eventName) => {
|
|
346
|
+
return context.searchTerm || null;
|
|
347
|
+
},
|
|
348
|
+
search_found: (context, eventName) => {
|
|
349
|
+
return !!context.searchFound;
|
|
350
|
+
},
|
|
351
|
+
search_quantity: (context, eventName) => {
|
|
352
|
+
return context.searchQuantity || 0;
|
|
353
|
+
},
|
|
354
|
+
items: getItems
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
// src/formatter/index.ts
|
|
358
|
+
async function getParameters(context = {}, eventName) {
|
|
359
|
+
const eventConfig = EVENTS[eventName];
|
|
360
|
+
if (!eventConfig) return;
|
|
361
|
+
const params = Object.fromEntries(
|
|
362
|
+
await Promise.all(
|
|
363
|
+
eventConfig.requiredParams.map(async (param) => {
|
|
364
|
+
const getter = paramGetters[param];
|
|
365
|
+
if (typeof getter !== "function") {
|
|
366
|
+
console.error(`[DT] Missing paramGetter for param: ${param}`);
|
|
367
|
+
return [param, null];
|
|
368
|
+
}
|
|
369
|
+
return [param, await getter(context, eventName)];
|
|
370
|
+
})
|
|
371
|
+
)
|
|
372
|
+
);
|
|
373
|
+
return params;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// src/index.ts
|
|
377
|
+
async function trackWebEvent(event, context = {}) {
|
|
378
|
+
try {
|
|
379
|
+
const parameters = await getParameters(context, event);
|
|
380
|
+
return await dispatchTrackEvent(event, parameters);
|
|
381
|
+
} catch (err) {
|
|
382
|
+
return console.error(`[DT] Error tracking event ${event}:`, err);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
386
|
+
0 && (module.exports = {
|
|
387
|
+
trackWebEvent
|
|
388
|
+
});
|
|
389
|
+
//# sourceMappingURL=mod.cjs.map
|
package/dist/mod.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/adapters/index.ts","../src/params/utils/index.ts","../src/params/resolvers/brand/fromOrderForm.ts","../src/params/resolvers/brand/fromItem.ts","../src/params/brand.ts","../src/params/resolvers/items/fromOrderForm.ts","../src/params/resolvers/items/fromItem.ts","../src/params/items.ts","../src/params/index.ts","../src/formatter/index.ts"],"sourcesContent":["import { dispatchTrackEvent } from './adapters';\nimport { getParameters } from './formatter';\nimport type { EventContext, EventName } from './types';\n\nasync function trackWebEvent(event: EventName, context: EventContext = {}) {\n try {\n // object data to be sent\n const parameters = await getParameters(context, event);\n\n // function to send event\n return await dispatchTrackEvent(event, parameters);\n } catch (err) {\n return console.error(`[DT] Error tracking event ${event}:`, err);\n }\n}\n\nexport { trackWebEvent };\n","export const EVENTS = {\n VIEW_CART: {\n name: 'view_cart',\n destinations: ['Dito', 'DataLayer',],\n requiredParams: [\n 'brand',\n 'region',\n 'line_items',\n 'currency',\n 'value',\n 'total_discount',\n 'subtotal',\n 'items',\n ],\n },\n\n ADD_TO_CART: {\n name: 'add_to_cart',\n destinations: ['DataLayer'],\n requiredParams: [\n 'brand',\n 'region',\n 'line_items',\n 'currency',\n 'value',\n 'items',\n ],\n },\n\n REMOVE_FROM_CART: {\n name: 'remove_from_cart',\n destinations: ['DataLayer'],\n requiredParams: [\n 'brand',\n 'region',\n 'line_items',\n 'currency',\n 'value',\n 'items',\n ],\n },\n\n ADD_COUPON: {\n name: 'add_coupon',\n destinations: ['DataLayer'],\n requiredParams: [\n 'brand',\n 'region',\n 'coupon',\n 'coupon_message',\n 'seller_cod_name',\n ],\n },\n\n SEARCH: {\n name: 'search',\n destinations: ['DataLayer'],\n requiredParams: ['brand', 'search_term', 'search_found', 'search_quantity'],\n },\n\n SEARCH_ZIPCODE: {\n name: 'search_zipcode',\n requiredParams: ['region'],\n },\n\n SELECT_CONTENT: {\n name: 'select_content',\n requiredParams: ['region'],\n },\n\n SELECT_ITEM: {\n name: 'select_item',\n requiredParams: ['region'],\n },\n\n VIEW_ITEM_LIST: {\n name: 'view_item_list',\n requiredParams: ['region'],\n },\n\n BEGIN_CHECKOUT: {\n name: 'begin_checkout',\n requiredParams: ['region'],\n },\n\n AUTH_ACTION: {\n name: 'auth_action',\n requiredParams: ['region'],\n },\n\n ADD_PERSONAL_INFO: {\n name: 'add_personal_info',\n destinations: ['DataLayer'],\n requiredParams: ['brand', 'pre_filled', 'line_items', 'currency', 'value', 'total_discount', 'subtotal'],\n },\n\n ADD_SHIPPING_INFO: {\n name: 'add_shipping_info',\n requiredParams: ['region'],\n },\n\n ADD_PAYMENT_INFO: {\n name: 'add_payment_info',\n requiredParams: ['region'],\n },\n\n ORDER_REVIWED: {\n name: 'order_reviewed',\n requiredParams: ['region'],\n },\n\n PURCHASE: {\n name: 'purchase',\n requiredParams: ['region'],\n },\n};\n","import { EVENTS } from '../constants';\nimport type { EventName, EventContext } from '../types'\n\nfunction dataTrackingLog(data: EventContext, color: string, destination: string) {\n console.log(\n `%c[${destination}] EVENTO DISPARADO:%c `,\n `background: ${color}; color: white; font-weight: bold; padding: 2px 4px; border-radius: 3px;`,\n 'color: #fff;',\n data || ''\n );\n}\n\nfunction pushToDataLayer(event: string, ecomm: EventContext, dest: string) {\n dataTrackingLog({ event: event, ecommerce: ecomm }, '#0b5fff', dest);\n}\n\nfunction pushToMeta(event: string, ecomm: EventContext, dest: string) {\n dataTrackingLog({ eventName: event, data: ecomm }, '#8C1007', dest);\n}\n\nfunction pushToDito(event: string, ecomm: EventContext, dest: string) {\n dataTrackingLog({ id: event, custom_data: ecomm }, '#00c851', dest);\n}\n\nconst adapters = {\n Meta: pushToMeta,\n DataLayer: pushToDataLayer,\n Dito: pushToDito,\n};\n\ntype AdapterKey = keyof typeof adapters;\n\nexport async function dispatchTrackEvent(eventName: EventName, data: EventContext) {\n const eventConfig = EVENTS[eventName] as { destinations: string[] };\n\n if (!eventConfig) return;\n\n await Promise.allSettled(\n eventConfig.destinations.map(async (dest: string) => {\n try {\n // call the adapter function based on the destination mapped in the adapters object\n // eventName is converted to lowercase to match the expected format in all adapters\n await adapters[dest as AdapterKey](eventName.toLowerCase(), data, dest);\n } catch (err) {\n console.error(`[DT] Failed to send ${eventName} to ${dest}:`, err);\n }\n })\n );\n}\n","export async function getProductDataById(id: any) {\n try {\n const response = await fetch(\n `/api/catalog_system/pub/products/search?fq=productId:${id}`\n );\n\n return await response.json();\n } catch (e) {\n console.log('[DT] Erro ao buscar dados do produto', e);\n }\n}\n\nexport function getItemShippingTier(orderForm: any, item: any) {\n const info = orderForm?.shippingData?.logisticsInfo?.find(\n (li: any) => li.itemId === item.id\n );\n\n const selectedSla = info?.slas?.find((sla: any) => sla.id === info.selectedSla);\n return selectedSla?.pickupStoreInfo?.friendlyName\n ? `retirada em loja: ${selectedSla.pickupStoreInfo.friendlyName}`\n : selectedSla?.name\n ? `Receba em casa: ${selectedSla.name}`\n : null;\n}\n\nexport async function getItemSku(item: any) {\n const product = await getProductDataById(item.productId);\n\n if (!product.length) return null;\n\n return product[0].items.find((i: any) => i.name === item.skuName)?.itemId ?? null;\n}\n\nexport function getDiscount(item: any) {\n return (\n parseFloat(Math.max(item.listPrice - item.sellingPrice, 0).toFixed(2)) || 0\n );\n}\n\nexport function getItemCategory(item: any) {\n return 'sale';\n}\n\nexport function getItemCategory2(item: any) {\n return 'sale2';\n}\n\nexport function getItemCategory4(item: any) {\n const tags = item?.additionalInfo?.tags || item?.tags;\n return Array.isArray(tags) && tags.length ? tags.join(',') : null;\n}\n\nconst brandMap = { Farm: 'farmrio', 'Farm Etc': 'farmetc' };\nexport function normalizeBrand(input: any) {\n if (typeof input === 'string') {\n return brandMap[input as keyof typeof brandMap] || null;\n }\n\n if (Array.isArray(input)) {\n const uniqueBrands = new Set(\n input.map((i) => brandMap[i.additionalInfo?.brandName as keyof typeof brandMap || i.brand])\n );\n return uniqueBrands.size ? [...uniqueBrands].join('_') : null;\n }\n\n return null;\n}\n","import { normalizeBrand } from '../../utils';\n\nexport function brandFromOrderForm(context: Record<string, any>) {\n if (!context.orderForm && !context.orderForm.items?.length) return null;\n\n const items = context.orderForm.items;\n\n return normalizeBrand(items);\n}\n","import { normalizeBrand } from '../../utils';\n\nexport function brandFromItem(context: Record<string, any>) {\n const { item } = context;\n\n return normalizeBrand(item.additionalInfo?.brandName || item.brand);\n}\n","import { brandFromOrderForm } from './resolvers/brand/fromOrderForm';\nimport { brandFromItem } from './resolvers/brand/fromItem';\nimport type { EventContext, EventName } from '../types';\n\nexport function getBrand(context: EventContext, eventName: EventName) {\n if (context?.brand) return context.brand;\n\n switch (eventName) {\n case 'VIEW_CART':\n case 'ADD_COUPON':\n case 'ADD_PERSONAL_INFO':\n return brandFromOrderForm(context);\n case 'ADD_TO_CART':\n case 'REMOVE_FROM_CART':\n return brandFromItem(context);\n default:\n return null;\n }\n}\n","import type { EventContext } from '../../../types';\n\nimport {\n getItemSku,\n getDiscount,\n getItemCategory,\n getItemCategory2,\n getItemCategory4,\n getItemShippingTier,\n normalizeBrand,\n} from '../../utils';\n\nexport async function itemsFromOrderForm(context: EventContext) {\n const items = context.orderForm?.items || [];\n\n if (!items.length) return [];\n\n return await Promise.all(\n items.map(async (item: EventContext) => ({\n item_id: item.productId,\n item_category2: getItemCategory2(item),\n item_category4: getItemCategory4(item),\n item_shipping_tier: getItemShippingTier(context.orderForm, item),\n price: parseFloat((item.price / 100).toFixed(2)) || 0,\n quantity: item.quantity || 1,\n item_ref: item.refId || null,\n item_brand: normalizeBrand(item.additionalInfo?.brandName) || null,\n item_sku: (await getItemSku(item)) || item.id || null,\n item_name: item.name || item.id || null,\n item_category: getItemCategory(item) || null,\n item_variant: item.skuName.split('-')[0].trim(),\n item_variant2: item.skuName.split('-')[1]?.trim() || '',\n discount: getDiscount(item),\n }))\n );\n}\n","import {\n getItemSku,\n getDiscount,\n getItemCategory,\n getItemCategory2,\n getItemCategory4,\n getItemShippingTier,\n} from '../../utils';\n\nexport async function itemsFromItem(context: Record<string, any>) {\n const { item, orderForm } = context;\n return [\n {\n item_id: item.productId,\n item_category2: getItemCategory2(item),\n item_category4: getItemCategory4(item),\n item_shipping_tier: getItemShippingTier(orderForm, item),\n price: parseFloat((item.price / 100).toFixed(2)) || 0,\n quantity: 1,\n item_ref: item.refId || null,\n item_brand: item.additionalInfo?.brandName || null,\n item_sku: (await getItemSku(item)) || item.id || null,\n item_name: item.name || item.id || null,\n item_category: getItemCategory(item) || null,\n item_variant: item.skuName.split('-')[0].trim(),\n item_variant2: item.skuName.split('-')[1]?.trim() || '',\n discount: getDiscount(item),\n },\n ];\n}\n","import { itemsFromOrderForm } from './resolvers/items/fromOrderForm';\nimport { itemsFromItem } from './resolvers/items/fromItem';\n\nexport function getItems(context: Record<string, any>, eventName: string) {\n switch (eventName) {\n case 'VIEW_CART':\n return itemsFromOrderForm(context);\n case 'ADD_TO_CART':\n case 'REMOVE_FROM_CART':\n return itemsFromItem(context);\n default:\n return null;\n }\n}\n","import type { EventContext, EventName } from '../types';\nimport { getBrand } from './brand';\nimport { getItems } from './items';\n\nexport const paramGetters = {\n brand: getBrand,\n\n region: (context: EventContext, eventName: EventName) => {\n return context.region || null;\n },\n\n line_items: (context: EventContext, eventName: EventName) => {\n return (context.orderForm.items || [])\n .map((item: EventContext) => item.productId)\n .join(',');\n },\n\n currency: (context: EventContext, eventName: EventName) => {\n return context.orderForm?.storePreferencesData?.currencyCode || null;\n },\n\n value: (context: EventContext, eventName: EventName) => {\n return context.item ? context.item.price : context.orderForm?.value != null\n ? context.orderForm.value / 100\n : null;\n },\n\n total_discount: (context: EventContext, eventName: EventName) => {\n return (\n context.orderForm?.totalizers\n ?.filter((t: EventContext) => t.id === 'Discounts')\n .reduce((acc: EventContext, t: EventContext) => acc + t.value, 0) / 100 || 0\n );\n },\n\n subtotal: (context: EventContext, eventName: EventName) => {\n return (\n context.orderForm?.totalizers\n ?.filter((t: EventContext) => t.id === 'Items')\n .reduce((acc: EventContext, t: EventContext) => acc + t.value, 0) / 100 || 0\n );\n },\n\n coupon_message: (context: EventContext, eventName: EventName) => {\n const messages = context.orderForm?.messages || [];\n\n if (messages.length === 0) return null;\n\n const couponMessages = messages.filter((msg: EventContext) =>\n msg.text.toLowerCase().includes('cupom')\n );\n\n if (couponMessages.length === 0) return null;\n\n return couponMessages.map((msg: EventContext) => msg.text).join(' | ');\n },\n\n seller_cod_name: (context: EventContext, eventName: EventName) => {\n return context.appliedSellerCodName || null;\n },\n\n coupon: (context: EventContext, eventName: EventName) => {\n return context.appliedCoupon || null;\n },\n\n pre_filled: (context: EventContext, eventName: EventName) => {\n return !!context.preFilled;\n },\n\n search_term: (context: EventContext, eventName: EventName) => {\n return context.searchTerm || null;\n },\n \n search_found: (context: EventContext, eventName: EventName) => {\n return !!context.searchFound;\n },\n\n search_quantity: (context: EventContext, eventName: EventName) => {\n return context.searchQuantity || 0;\n },\n\n items: getItems,\n};\n","import { EVENTS } from '../constants';\nimport { paramGetters } from '../params';\nimport type { EventName, EventContext } from '../types'\n\ntype ParamName = keyof typeof paramGetters;\n\nexport async function getParameters(context: EventContext = {}, eventName: EventName) {\n const eventConfig = EVENTS[eventName] as { requiredParams: string[] };\n\n if (!eventConfig) return;\n\n const params = Object.fromEntries(\n await Promise.all(\n eventConfig.requiredParams.map(async (param) => {\n const getter = paramGetters[param as ParamName];\n\n if (typeof getter !== 'function') {\n console.error(`[DT] Missing paramGetter for param: ${param}`);\n return [param, null]; // ou undefined\n }\n \n return [param, await getter(context, eventName)];\n })\n )\n );\n\n return params;\n}\n"],"mappings":"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","names":[]}
|
package/dist/mod.d.cts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
declare const EVENTS: {
|
|
2
|
+
VIEW_CART: {
|
|
3
|
+
name: string;
|
|
4
|
+
destinations: string[];
|
|
5
|
+
requiredParams: string[];
|
|
6
|
+
};
|
|
7
|
+
ADD_TO_CART: {
|
|
8
|
+
name: string;
|
|
9
|
+
destinations: string[];
|
|
10
|
+
requiredParams: string[];
|
|
11
|
+
};
|
|
12
|
+
REMOVE_FROM_CART: {
|
|
13
|
+
name: string;
|
|
14
|
+
destinations: string[];
|
|
15
|
+
requiredParams: string[];
|
|
16
|
+
};
|
|
17
|
+
ADD_COUPON: {
|
|
18
|
+
name: string;
|
|
19
|
+
destinations: string[];
|
|
20
|
+
requiredParams: string[];
|
|
21
|
+
};
|
|
22
|
+
SEARCH: {
|
|
23
|
+
name: string;
|
|
24
|
+
destinations: string[];
|
|
25
|
+
requiredParams: string[];
|
|
26
|
+
};
|
|
27
|
+
SEARCH_ZIPCODE: {
|
|
28
|
+
name: string;
|
|
29
|
+
requiredParams: string[];
|
|
30
|
+
};
|
|
31
|
+
SELECT_CONTENT: {
|
|
32
|
+
name: string;
|
|
33
|
+
requiredParams: string[];
|
|
34
|
+
};
|
|
35
|
+
SELECT_ITEM: {
|
|
36
|
+
name: string;
|
|
37
|
+
requiredParams: string[];
|
|
38
|
+
};
|
|
39
|
+
VIEW_ITEM_LIST: {
|
|
40
|
+
name: string;
|
|
41
|
+
requiredParams: string[];
|
|
42
|
+
};
|
|
43
|
+
BEGIN_CHECKOUT: {
|
|
44
|
+
name: string;
|
|
45
|
+
requiredParams: string[];
|
|
46
|
+
};
|
|
47
|
+
AUTH_ACTION: {
|
|
48
|
+
name: string;
|
|
49
|
+
requiredParams: string[];
|
|
50
|
+
};
|
|
51
|
+
ADD_PERSONAL_INFO: {
|
|
52
|
+
name: string;
|
|
53
|
+
destinations: string[];
|
|
54
|
+
requiredParams: string[];
|
|
55
|
+
};
|
|
56
|
+
ADD_SHIPPING_INFO: {
|
|
57
|
+
name: string;
|
|
58
|
+
requiredParams: string[];
|
|
59
|
+
};
|
|
60
|
+
ADD_PAYMENT_INFO: {
|
|
61
|
+
name: string;
|
|
62
|
+
requiredParams: string[];
|
|
63
|
+
};
|
|
64
|
+
ORDER_REVIWED: {
|
|
65
|
+
name: string;
|
|
66
|
+
requiredParams: string[];
|
|
67
|
+
};
|
|
68
|
+
PURCHASE: {
|
|
69
|
+
name: string;
|
|
70
|
+
requiredParams: string[];
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
type EventName = keyof typeof EVENTS;
|
|
75
|
+
type EventContext = Record<string, any>;
|
|
76
|
+
|
|
77
|
+
declare function trackWebEvent(event: EventName, context?: EventContext): Promise<void>;
|
|
78
|
+
|
|
79
|
+
export { trackWebEvent };
|