@cnv-vn/track 0.2.0-beta.8 → 0.3.0-beta.2
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 +16 -16
- package/dist/cnv-track.esm.js +2 -2
- package/dist/cnv-track.min.js +2 -2
- package/dist/cnv-track.umd.cjs +2 -2
- package/dist/types/index.d.ts +177 -0
- package/package.json +8 -5
package/dist/types/index.d.ts
CHANGED
|
@@ -97,6 +97,31 @@ interface ContextCampaign {
|
|
|
97
97
|
*/
|
|
98
98
|
clickIds?: Record<string, string>;
|
|
99
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Nguồn đưa khách tới lần ĐẦU TIÊN, đính vào `context` của event `page` (xem
|
|
102
|
+
* `core/attribution.ts` và `attachFirstTouch` ở `core/runtime.ts` để biết vì sao là `page`). Đây cũng đúng shape của `attribution` trong thân
|
|
103
|
+
* `POST /js/v1/zalo-qr/session` — một hình dạng dùng cho cả hai đường là cố ý: chỉ cần một chỗ ánh xạ
|
|
104
|
+
* (`toAttributionWire`), nên chỉ có một chỗ có thể ánh xạ sai.
|
|
105
|
+
*
|
|
106
|
+
* Vì sao tên field là `utm_*` chứ không theo Segment Spec như {@link ContextCampaign}: đích đến là
|
|
107
|
+
* `ContactEntity.source_info` của CDP, nơi các field tên đúng là `utm_source`/`utm_medium`/…, và cột
|
|
108
|
+
* `utm_*` trong ClickHouse. Giữ nguyên tên đích thì không hop nào phải dịch — chính chỗ dịch
|
|
109
|
+
* `campaign.name` → `utm_name` đang làm mất `utm_campaign` ở luồng event của tracking-api.
|
|
110
|
+
*/
|
|
111
|
+
interface ContextFirstTouch {
|
|
112
|
+
utm_source?: string;
|
|
113
|
+
utm_medium?: string;
|
|
114
|
+
utm_campaign?: string;
|
|
115
|
+
utm_term?: string;
|
|
116
|
+
utm_content?: string;
|
|
117
|
+
utm_id?: string;
|
|
118
|
+
/** `fbclid`/`gclid`/… — vắng mặt khi `allowAdTracking: false`. */
|
|
119
|
+
click_ids?: Record<string, string>;
|
|
120
|
+
referrer?: string;
|
|
121
|
+
landing_page?: string;
|
|
122
|
+
/** epoch-ms lúc GHI nguồn (không phải lúc gửi event) — phân biệt nguồn vừa chớm với nguồn 2 năm trước. */
|
|
123
|
+
first_seen_at?: number;
|
|
124
|
+
}
|
|
100
125
|
interface ContextLibrary {
|
|
101
126
|
/** Always `@cnv/track`. */
|
|
102
127
|
name: string;
|
|
@@ -118,6 +143,16 @@ interface PayloadContext {
|
|
|
118
143
|
userAgent?: string;
|
|
119
144
|
library?: ContextLibrary;
|
|
120
145
|
campaign?: ContextCampaign;
|
|
146
|
+
/**
|
|
147
|
+
* CNV extension — nguồn first-touch, CHỈ đính vào event `page`.
|
|
148
|
+
*
|
|
149
|
+
* `campaign` ở trên là UTM của CHÍNH event này (mất ngay ở pageview thứ hai); `firstTouch` là nguồn
|
|
150
|
+
* ban đầu của cả khách, sống qua nhiều phiên và qua nhiều ngày.
|
|
151
|
+
*
|
|
152
|
+
* Vì sao là `page` chứ không phải `identify`/`track`: xem `attachFirstTouch` trong `core/runtime.ts`
|
|
153
|
+
* — collector bỏ hẳn `identify`, còn `track` tên mới bị allowlist drop im lặng.
|
|
154
|
+
*/
|
|
155
|
+
firstTouch?: ContextFirstTouch;
|
|
121
156
|
/**
|
|
122
157
|
* Pre-consent flag. Gateway may downgrade storage or skip forwarding to
|
|
123
158
|
* marketing destinations when `marketing === false`.
|
|
@@ -496,6 +531,135 @@ interface RemoteConfigEnvelope {
|
|
|
496
531
|
zaloQrLogin?: {
|
|
497
532
|
enabled?: boolean;
|
|
498
533
|
};
|
|
534
|
+
/** Cấu hình Launcher (FAB loyalty/rewards) đã publish — `config: null` = chưa cấu hình lần nào. */
|
|
535
|
+
launcher?: {
|
|
536
|
+
/** Version riêng của Launcher (tăng mỗi lần Lưu) — KHÔNG dùng chung với `version` ở trên (2 tính năng publish độc lập). */
|
|
537
|
+
version?: number;
|
|
538
|
+
updatedAt?: string;
|
|
539
|
+
config?: LauncherRemoteConfig | null;
|
|
540
|
+
};
|
|
541
|
+
/** Cấu hình Panel (nội dung mở ra khi khách click Launcher) đã publish — entity RIÊNG với
|
|
542
|
+
* `launcher` (xem `ke_hoach_tinh_nang_launcher.md` §8.1), `config: null` = chưa cấu hình lần nào. */
|
|
543
|
+
panel?: {
|
|
544
|
+
/** Version riêng của Panel — publish độc lập với `launcher`/`version` ở trên. */
|
|
545
|
+
version?: number;
|
|
546
|
+
updatedAt?: string;
|
|
547
|
+
config?: PanelRemoteConfig | null;
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Cấu hình Launcher do dashboard CDP quản lý (`ke_hoach_tinh_nang_launcher.md` §7) — khớp 1:1
|
|
552
|
+
* model `LauncherConfigDocument.LauncherConfig` (tracking-system) và `LauncherConfig`
|
|
553
|
+
* (cdp-frontend, `tracking-launcher-config.model.ts`). SDK chỉ ĐỌC bản published, dùng để tự
|
|
554
|
+
* render FAB (xem `core/launcher.ts`) — không có API ghi nào ở SDK.
|
|
555
|
+
*/
|
|
556
|
+
interface LauncherRemoteConfig {
|
|
557
|
+
buttonTextDesktop?: string;
|
|
558
|
+
buttonTextMobile?: string;
|
|
559
|
+
/** `'DEFAULT'` dùng `iconPreset`; `'CUSTOM'` dùng `customIconUrl`. */
|
|
560
|
+
iconType?: 'DEFAULT' | 'CUSTOM';
|
|
561
|
+
iconPreset?: 'BAG_HEART' | 'TAG' | 'CROWN' | 'STAR' | 'GIFT';
|
|
562
|
+
customIconUrl?: string | null;
|
|
563
|
+
buttonShape?: 'SQUARE' | 'SHAVED' | 'ROUNDED' | 'CIRCULAR';
|
|
564
|
+
placementDesktop?: LauncherPlacement;
|
|
565
|
+
placementMobile?: LauncherPlacement;
|
|
566
|
+
backgroundColor?: string;
|
|
567
|
+
textColor?: string;
|
|
568
|
+
contentLayoutDesktop?: 'ICON_WITH_TEXT' | 'TEXT_ONLY' | 'ICON_ONLY';
|
|
569
|
+
contentLayoutMobile?: 'TEXT_ONLY' | 'ICON_ONLY';
|
|
570
|
+
deviceVisibility?: 'DESKTOP_AND_MOBILE' | 'DESKTOP_ONLY' | 'NONE';
|
|
571
|
+
hideOnHomepage?: boolean;
|
|
572
|
+
/** Mỗi phần tử là 1 chuỗi con cần khớp (contains) `location.pathname + location.search`. */
|
|
573
|
+
hideUrlConditions?: string[];
|
|
574
|
+
useCustomZIndex?: boolean;
|
|
575
|
+
zIndex?: number | null;
|
|
576
|
+
/** `true` ⇒ SDK áp style vị trí/z-index bằng `!important` (phòng CSS site đè lên). */
|
|
577
|
+
addImportantRule?: boolean;
|
|
578
|
+
}
|
|
579
|
+
interface LauncherPlacement {
|
|
580
|
+
position: 'LEFT' | 'RIGHT';
|
|
581
|
+
sideSpacing: number;
|
|
582
|
+
bottomSpacing: number;
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Cấu hình Panel do dashboard CDP quản lý (`ke_hoach_tinh_nang_launcher.md` §8) — khớp 1:1
|
|
586
|
+
* model `PanelConfigDocument.PanelConfig` (tracking-system) và `PanelConfig` (cdp-frontend,
|
|
587
|
+
* `tracking-panel-config.model.ts`), TRỪ 2 field `bannerImageResourceKey`/`brandIconResourceKey`
|
|
588
|
+
* (chỉ dùng để quản lý media ở tầng admin, SDK chỉ cần `url` để render). SDK chỉ ĐỌC bản
|
|
589
|
+
* published, dùng để tự render nội dung Panel (xem `core/panel.ts`).
|
|
590
|
+
*/
|
|
591
|
+
interface PanelRemoteConfig {
|
|
592
|
+
bannerImageUrl?: string | null;
|
|
593
|
+
brandIconUrl?: string | null;
|
|
594
|
+
headerVisitor?: PanelHeaderCopy;
|
|
595
|
+
headerMember?: PanelHeaderCopy;
|
|
596
|
+
accountCreationCta?: PanelAccountCreationCta;
|
|
597
|
+
/** Thứ tự + bật/tắt từng section — chỉ `POINTS` có nội dung thật, xem `core/panel.ts`. */
|
|
598
|
+
sections?: PanelSectionConfig[];
|
|
599
|
+
/**
|
|
600
|
+
* Block tự soạn cho view "Cách kiếm thêm điểm". Rỗng/thiếu ⇒ dòng menu giữ hành vi cũ: chỉ bắn
|
|
601
|
+
* `cnv:panel:menu-click` cho site tự điều hướng, Panel KHÔNG mở view nào (shop chưa cấu hình thì
|
|
602
|
+
* không được mở ra một màn trống).
|
|
603
|
+
*/
|
|
604
|
+
earnBlocks?: PanelContentBlock[];
|
|
605
|
+
/** Cùng vai trò `earnBlocks`, cho view "Cách đổi điểm". */
|
|
606
|
+
redeemBlocks?: PanelContentBlock[];
|
|
607
|
+
theme?: 'LIGHT' | 'DARK';
|
|
608
|
+
colors?: PanelColors;
|
|
609
|
+
shapes?: PanelShapes;
|
|
610
|
+
wallpaper?: 'NONE' | 'WAVES' | 'CUBES' | 'FUN' | 'GEOMETRIC' | 'CROSS_HATCHING';
|
|
611
|
+
/** `true` ⇒ bỏ chân panel "Cung cấp bởi CNV Loyalty". Thiếu/`false` = vẫn hiện (mặc định). */
|
|
612
|
+
hideBranding?: boolean;
|
|
613
|
+
}
|
|
614
|
+
interface PanelHeaderCopy {
|
|
615
|
+
caption?: string;
|
|
616
|
+
title?: string;
|
|
617
|
+
}
|
|
618
|
+
interface PanelAccountCreationCta {
|
|
619
|
+
title?: string;
|
|
620
|
+
description?: string;
|
|
621
|
+
signInLinkText?: string;
|
|
622
|
+
createAccountButtonText?: string;
|
|
623
|
+
}
|
|
624
|
+
interface PanelSectionConfig {
|
|
625
|
+
type?: 'POINTS' | 'REFERRAL' | 'VIP';
|
|
626
|
+
enabled?: boolean;
|
|
627
|
+
order?: number;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Icon dựng sẵn cho 1 block nội dung — merchant CHỌN từ bộ này ở dashboard, không tải ảnh riêng.
|
|
631
|
+
* Khoá lạ (dashboard mới hơn bản SDK đang cache trên máy khách) lùi về icon của chính view chứ
|
|
632
|
+
* không vẽ ô rỗng — cùng nguyên tắc fail-safe `SECTIONS` đang áp cho section type lạ.
|
|
633
|
+
*/
|
|
634
|
+
type PanelBlockIcon = 'ORDER' | 'STAR' | 'GIFT' | 'USERS' | 'CAKE' | 'SHARE' | 'COIN' | 'CHECK';
|
|
635
|
+
/**
|
|
636
|
+
* 1 block nội dung do MERCHANT tự soạn cho view "Cách kiếm thêm điểm" / "Cách đổi điểm".
|
|
637
|
+
*
|
|
638
|
+
* Panel hiển thị NGUYÊN VĂN, không suy ra con số nào từ nghiệp vụ loyalty — khác hẳn `points`/
|
|
639
|
+
* `tier` (số thật, do server tính). Đây là chỗ shop tự khai luật tích/đổi điểm của mình, vì luật
|
|
640
|
+
* đó nằm ngoài dữ liệu mà tracking-api đọc được.
|
|
641
|
+
*/
|
|
642
|
+
interface PanelContentBlock {
|
|
643
|
+
icon?: PanelBlockIcon;
|
|
644
|
+
title?: string;
|
|
645
|
+
description?: string;
|
|
646
|
+
}
|
|
647
|
+
interface PanelColors {
|
|
648
|
+
bannerBg?: string;
|
|
649
|
+
bannerFont?: string;
|
|
650
|
+
/** Mirror model admin — `core/panel.ts` hiện CHƯA render field này (Panel không có header bar riêng). */
|
|
651
|
+
headerBarFont?: string;
|
|
652
|
+
buttonBg?: string;
|
|
653
|
+
buttonFont?: string;
|
|
654
|
+
linkColor?: string;
|
|
655
|
+
iconColor?: string;
|
|
656
|
+
}
|
|
657
|
+
interface PanelShapes {
|
|
658
|
+
container?: 'SQUARE' | 'ROUNDED';
|
|
659
|
+
card?: 'SQUARE' | 'ROUNDED';
|
|
660
|
+
button?: 'SQUARE' | 'ROUNDED';
|
|
661
|
+
/** Mirror model admin — `core/panel.ts` hiện CHƯA render field này (Panel chưa có input nào). */
|
|
662
|
+
input?: 'SQUARE' | 'ROUNDED';
|
|
499
663
|
}
|
|
500
664
|
/**
|
|
501
665
|
* Lý do `loginWithZalo()` thất bại (`ZaloQrLoginError.reason`). LƯU Ý phạm vi
|
|
@@ -551,6 +715,19 @@ interface ZaloQrLoginResult {
|
|
|
551
715
|
level?: string;
|
|
552
716
|
/** Điểm kinh nghiệm/tích luỹ hiện tại (nếu có). */
|
|
553
717
|
xp?: number;
|
|
718
|
+
/**
|
|
719
|
+
* JWT HẸP QUYỀN, sống 24h — dùng DUY NHẤT để gọi lại `GET {endpoint}/panel/session` khôi phục
|
|
720
|
+
* trạng thái Member sau khi khách F5 lại trang, KHÁC HẲN apiToken/loginToken thật (365 ngày, đã
|
|
721
|
+
* bị chặn không trả về client — xem javadoc trên). An toàn hơn hẳn token thật vì: hẹp quyền (chỉ
|
|
722
|
+
* verify được ở đúng 1 endpoint này), sống ngắn (24h), và khoá ký riêng theo từng project — lộ
|
|
723
|
+
* token này chỉ lộ đúng tên/hạng/điểm của 1 khách, không dùng được ở bất kỳ API nào khác trong hệ
|
|
724
|
+
* sinh thái CNV. `panel.ts` tự lưu 2 field này vào `localStorage` để khôi phục Member state lúc
|
|
725
|
+
* mở lại trang — integrator dùng `loginWithZalo()` trực tiếp (không qua Panel) có thể tự làm
|
|
726
|
+
* tương tự nếu muốn hành vi "nhớ đăng nhập" giống vậy.
|
|
727
|
+
*/
|
|
728
|
+
panelSessionToken?: string;
|
|
729
|
+
/** Epoch-ms hết hạn của {@link panelSessionToken} — so `Date.now() > panelSessionExp` không cần decode JWT. */
|
|
730
|
+
panelSessionExp?: number;
|
|
554
731
|
}
|
|
555
732
|
/**
|
|
556
733
|
* Phiên QR-login đang chờ người dùng quét. SDK KHÔNG tự vẽ QR — host page tự
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cnv-vn/track",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "CNV Tracking SDK — lightweight, async-first web analytics tracker (<
|
|
3
|
+
"version": "0.3.0-beta.2",
|
|
4
|
+
"description": "CNV Tracking SDK — lightweight, async-first web analytics tracker (<30KB gzipped).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"analytics",
|
|
7
7
|
"tracking",
|
|
@@ -97,14 +97,17 @@
|
|
|
97
97
|
{
|
|
98
98
|
"name": "IIFE (minified + gzipped)",
|
|
99
99
|
"path": "dist/cnv-track.min.js",
|
|
100
|
-
"limit": "
|
|
100
|
+
"limit": "50 KB",
|
|
101
101
|
"gzip": true
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
"name": "ESM tree-shaken (gzipped)",
|
|
105
105
|
"path": "dist/cnv-track.esm.js",
|
|
106
|
-
"limit": "
|
|
106
|
+
"limit": "50 KB",
|
|
107
107
|
"gzip": true
|
|
108
108
|
}
|
|
109
|
-
]
|
|
109
|
+
],
|
|
110
|
+
"dependencies": {
|
|
111
|
+
"qrcode-generator": "^2.0.4"
|
|
112
|
+
}
|
|
110
113
|
}
|