@alexsab-ru/scripts 0.14.0 → 0.15.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.
@@ -0,0 +1,162 @@
1
+ import { getCookie, setCookie } from '../cookie';
2
+
3
+ /**
4
+ * Persist Campaign Data - сохраняет данные кампании в cookies и/или dataLayer
5
+ * @param {Object} options - Настройки функции
6
+ * @param {boolean} options.storeInCookie - Сохранять ли данные в cookies
7
+ * @param {boolean} options.pushToDataLayer - Отправлять ли данные в dataLayer
8
+ * @param {string[]} options.triggerParameters - Параметры URL, которые триггерят сохранение
9
+ * @param {string} options.urlCookieName - Имя cookie для URL кампании
10
+ * @param {string} options.referrerCookieName - Имя cookie для referrer
11
+ * @param {string} options.dataLayerName - Имя массива dataLayer
12
+ * @param {string} options.dataLayerKey - Ключ в dataLayer для оригинального URL
13
+ * @param {number} options.cookieExpireDays - Дни жизни cookie (по умолчанию session cookie)
14
+ * @returns {boolean} - true если операция прошла успешно
15
+ */
16
+ export function persistCampaignData(options = {}) {
17
+ const defaultOptions = {
18
+ storeInCookie: true,
19
+ pushToDataLayer: true,
20
+ triggerParameters: ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'utm_id', 'gclid', 'yclid', 'ysclid'],
21
+ urlCookieName: '__gtm_campaign_url',
22
+ referrerCookieName: '__gtm_referrer',
23
+ dataLayerName: 'dataLayer',
24
+ dataLayerKey: 'originalLocation',
25
+ cookieExpireDays: null // session cookie by default
26
+ };
27
+
28
+ const config = { ...defaultOptions, ...options };
29
+ let success = true;
30
+
31
+ try {
32
+ // Получаем текущий URL и его параметры
33
+ const currentUrl = window.location.href;
34
+ const urlParams = new URLSearchParams(window.location.search);
35
+ const currentHost = window.location.hostname;
36
+ const referrer = document.referrer;
37
+
38
+ if (config.storeInCookie) {
39
+ // Проверяем, есть ли в URL параметры кампании
40
+ const hasCampaignParams = config.triggerParameters.some(param =>
41
+ urlParams.has(param)
42
+ );
43
+
44
+ if (hasCampaignParams) {
45
+ // Сохраняем URL с параметрами кампании
46
+ const cookieOptions = {};
47
+ if (config.cookieExpireDays) {
48
+ cookieOptions.expires = config.cookieExpireDays * 24 * 60 * 60; // в секундах
49
+ }
50
+
51
+ setCookie(config.urlCookieName, currentUrl, cookieOptions);
52
+ }
53
+
54
+ // Проверяем referrer - если домен отличается, сохраняем его
55
+ if (referrer) {
56
+ try {
57
+ const referrerUrl = new URL(referrer);
58
+ const referrerHost = referrerUrl.hostname;
59
+
60
+ if (referrerHost !== currentHost && !referrerHost.includes(currentHost)) {
61
+ const cookieOptions = {};
62
+ if (config.cookieExpireDays) {
63
+ cookieOptions.expires = config.cookieExpireDays * 24 * 60 * 60;
64
+ }
65
+
66
+ setCookie(config.referrerCookieName, referrer, cookieOptions);
67
+ }
68
+ } catch (e) {
69
+ console.warn('Invalid referrer URL:', referrer);
70
+ }
71
+ }
72
+ }
73
+
74
+ if (config.pushToDataLayer) {
75
+ // Отправляем оригинальный URL в dataLayer
76
+ if (typeof window !== 'undefined') {
77
+ // Создаем dataLayer если его нет
78
+ window[config.dataLayerName] = window[config.dataLayerName] || [];
79
+
80
+ const dataLayerEvent = {
81
+ event: 'originalLocation',
82
+ [config.dataLayerKey]: currentUrl
83
+ };
84
+
85
+ window[config.dataLayerName].push(dataLayerEvent);
86
+ }
87
+ }
88
+
89
+ } catch (error) {
90
+ console.error('Error in persistCampaignData:', error);
91
+ success = false;
92
+ }
93
+
94
+ return success;
95
+ }
96
+
97
+ /**
98
+ * Получает сохраненные данные кампании из cookies
99
+ * @param {Object} options - Настройки
100
+ * @param {string} options.urlCookieName - Имя cookie для URL кампании
101
+ * @param {string} options.referrerCookieName - Имя cookie для referrer
102
+ * @returns {Object} - Объект с данными кампании
103
+ */
104
+ export function getCampaignData(options = {}) {
105
+ const config = {
106
+ urlCookieName: '__gtm_campaign_url',
107
+ referrerCookieName: '__gtm_referrer',
108
+ ...options
109
+ };
110
+
111
+ return {
112
+ campaignUrl: getCookie(config.urlCookieName),
113
+ referrer: getCookie(config.referrerCookieName)
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Извлекает UTM параметры из URL или сохраненных данных кампании
119
+ * @param {string} url - URL для анализа (по умолчанию текущий URL)
120
+ * @returns {Object} - Объект с UTM параметрами
121
+ */
122
+ export function extractUtmParameters(url = null) {
123
+ const targetUrl = url || window.location.href;
124
+ const urlObj = new URL(targetUrl);
125
+ const params = urlObj.searchParams;
126
+
127
+ return {
128
+ utm_source: params.get('utm_source'),
129
+ utm_medium: params.get('utm_medium'),
130
+ utm_campaign: params.get('utm_campaign'),
131
+ utm_term: params.get('utm_term'),
132
+ utm_content: params.get('utm_content'),
133
+ utm_id: params.get('utm_id'),
134
+ gclid: params.get('gclid'),
135
+ yclid: params.get('yclid'),
136
+ ysclid: params.get('ysclid')
137
+ };
138
+ }
139
+
140
+ /**
141
+ * Автоматическая инициализация при загрузке страницы
142
+ * @param {Object} options - Настройки для persistCampaignData
143
+ */
144
+ export function initPersistCampaignData(options = {}) {
145
+ if (typeof window !== 'undefined') {
146
+ if (document.readyState === 'loading') {
147
+ document.addEventListener('DOMContentLoaded', () => {
148
+ persistCampaignData(options);
149
+ });
150
+ } else {
151
+ persistCampaignData(options);
152
+ }
153
+ }
154
+ }
155
+
156
+ // Экспорт по умолчанию для удобства
157
+ export default {
158
+ persistCampaignData,
159
+ getCampaignData,
160
+ extractUtmParameters,
161
+ initPersistCampaignData
162
+ };
@@ -0,0 +1,290 @@
1
+ // TypeScript определения для persist-campaign-data
2
+
3
+ /**
4
+ * Настройки для функции persistCampaignData
5
+ */
6
+ export interface PersistCampaignDataOptions {
7
+ /**
8
+ * Сохранять ли данные в cookies браузера
9
+ * @default true
10
+ */
11
+ storeInCookie?: boolean;
12
+
13
+ /**
14
+ * Отправлять ли данные в dataLayer
15
+ * @default true
16
+ */
17
+ pushToDataLayer?: boolean;
18
+
19
+ /**
20
+ * Параметры URL, которые триггерят сохранение данных кампании
21
+ * @default ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'utm_id', 'gclid', 'yclid', 'ysclid']
22
+ */
23
+ triggerParameters?: string[];
24
+
25
+ /**
26
+ * Имя cookie для сохранения URL кампании
27
+ * @default '__gtm_campaign_url'
28
+ */
29
+ urlCookieName?: string;
30
+
31
+ /**
32
+ * Имя cookie для сохранения referrer
33
+ * @default '__gtm_referrer'
34
+ */
35
+ referrerCookieName?: string;
36
+
37
+ /**
38
+ * Имя массива dataLayer
39
+ * @default 'dataLayer'
40
+ */
41
+ dataLayerName?: string;
42
+
43
+ /**
44
+ * Ключ в dataLayer для оригинального URL
45
+ * @default 'originalLocation'
46
+ */
47
+ dataLayerKey?: string;
48
+
49
+ /**
50
+ * Количество дней жизни cookie. Если null - session cookie
51
+ * @default null
52
+ */
53
+ cookieExpireDays?: number | null;
54
+ }
55
+
56
+ /**
57
+ * Настройки для функции getCampaignData
58
+ */
59
+ export interface GetCampaignDataOptions {
60
+ /**
61
+ * Имя cookie для URL кампании
62
+ * @default '__gtm_campaign_url'
63
+ */
64
+ urlCookieName?: string;
65
+
66
+ /**
67
+ * Имя cookie для referrer
68
+ * @default '__gtm_referrer'
69
+ */
70
+ referrerCookieName?: string;
71
+ }
72
+
73
+ /**
74
+ * Результат функции getCampaignData
75
+ */
76
+ export interface CampaignData {
77
+ /**
78
+ * URL кампании из cookie
79
+ */
80
+ campaignUrl?: string;
81
+
82
+ /**
83
+ * Referrer из cookie
84
+ */
85
+ referrer?: string;
86
+ }
87
+
88
+ /**
89
+ * UTM параметры извлеченные из URL
90
+ */
91
+ export interface UtmParameters {
92
+ /**
93
+ * Источник трафика
94
+ */
95
+ utm_source: string | null;
96
+
97
+ /**
98
+ * Канал/медиум
99
+ */
100
+ utm_medium: string | null;
101
+
102
+ /**
103
+ * Название кампании
104
+ */
105
+ utm_campaign: string | null;
106
+
107
+ /**
108
+ * Ключевое слово
109
+ */
110
+ utm_term: string | null;
111
+
112
+ /**
113
+ * Контент/вариация
114
+ */
115
+ utm_content: string | null;
116
+
117
+ /**
118
+ * ID кампании
119
+ */
120
+ utm_id: string | null;
121
+
122
+ /**
123
+ * Google Click ID
124
+ */
125
+ gclid: string | null;
126
+
127
+ /**
128
+ * Yandex Click ID
129
+ */
130
+ yclid: string | null;
131
+
132
+ /**
133
+ * Yandex Search Click ID
134
+ */
135
+ ysclid: string | null;
136
+ }
137
+
138
+ /**
139
+ * Событие dataLayer для оригинального URL
140
+ */
141
+ export interface OriginalLocationEvent {
142
+ /**
143
+ * Название события
144
+ */
145
+ event: 'originalLocation';
146
+
147
+ /**
148
+ * Оригинальный URL страницы
149
+ */
150
+ [key: string]: string;
151
+ }
152
+
153
+ /**
154
+ * Расширение глобального объекта Window для dataLayer
155
+ */
156
+ declare global {
157
+ interface Window {
158
+ /**
159
+ * Массив dataLayer для Google Tag Manager
160
+ */
161
+ dataLayer?: any[];
162
+
163
+ /**
164
+ * Флаг для предотвращения повторной инициализации в SPA
165
+ */
166
+ campaignDataPersisted?: boolean;
167
+
168
+ /**
169
+ * Кастомный dataLayer с произвольным именем
170
+ */
171
+ [key: string]: any;
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Сохраняет данные рекламной кампании в cookies и/или dataLayer
177
+ * @param options - Настройки функции
178
+ * @returns true если операция прошла успешно, false в случае ошибки
179
+ */
180
+ export function persistCampaignData(options?: PersistCampaignDataOptions): boolean;
181
+
182
+ /**
183
+ * Получает сохраненные данные кампании из cookies
184
+ * @param options - Настройки для получения данных
185
+ * @returns Объект с данными кампании из cookies
186
+ */
187
+ export function getCampaignData(options?: GetCampaignDataOptions): CampaignData;
188
+
189
+ /**
190
+ * Извлекает UTM параметры из URL
191
+ * @param url - URL для анализа. Если не указан, используется текущий URL
192
+ * @returns Объект с UTM параметрами
193
+ */
194
+ export function extractUtmParameters(url?: string): UtmParameters;
195
+
196
+ /**
197
+ * Автоматическая инициализация при загрузке страницы
198
+ * Выполняет persistCampaignData когда DOM готов
199
+ * @param options - Настройки для persistCampaignData
200
+ */
201
+ export function initPersistCampaignData(options?: PersistCampaignDataOptions): void;
202
+
203
+ /**
204
+ * Объект с экспортированными функциями по умолчанию
205
+ */
206
+ declare const _default: {
207
+ persistCampaignData: typeof persistCampaignData;
208
+ getCampaignData: typeof getCampaignData;
209
+ extractUtmParameters: typeof extractUtmParameters;
210
+ initPersistCampaignData: typeof initPersistCampaignData;
211
+ };
212
+
213
+ export default _default;
214
+
215
+ /**
216
+ * Типы для интеграции с популярными фреймворками
217
+ */
218
+
219
+ /**
220
+ * React Hook для использования persist campaign data
221
+ */
222
+ export interface UsePersistCampaignData {
223
+ /**
224
+ * Данные кампании из cookies
225
+ */
226
+ campaignData: CampaignData;
227
+
228
+ /**
229
+ * UTM параметры из текущего URL
230
+ */
231
+ utmParameters: UtmParameters;
232
+
233
+ /**
234
+ * Функция для принудительного обновления данных
235
+ */
236
+ refresh: () => void;
237
+
238
+ /**
239
+ * Статус инициализации
240
+ */
241
+ isInitialized: boolean;
242
+ }
243
+
244
+ /**
245
+ * Vue.js композабл для persist campaign data
246
+ */
247
+ export interface VuePersistCampaignData {
248
+ /**
249
+ * Реактивные данные кампании
250
+ */
251
+ campaignData: Ref<CampaignData>;
252
+
253
+ /**
254
+ * Реактивные UTM параметры
255
+ */
256
+ utmParameters: Ref<UtmParameters>;
257
+
258
+ /**
259
+ * Функция инициализации
260
+ */
261
+ init: (options?: PersistCampaignDataOptions) => void;
262
+
263
+ /**
264
+ * Статус готовности
265
+ */
266
+ isReady: Ref<boolean>;
267
+ }
268
+
269
+ /**
270
+ * Next.js типы для серверного рендеринга
271
+ */
272
+ export interface NextJsPersistCampaignData {
273
+ /**
274
+ * Серверные props с данными кампании
275
+ */
276
+ campaignData?: CampaignData;
277
+
278
+ /**
279
+ * UTM параметры из серверного запроса
280
+ */
281
+ utmParameters?: UtmParameters;
282
+ }
283
+
284
+ // Для совместимости с CommonJS
285
+ export = {
286
+ persistCampaignData,
287
+ getCampaignData,
288
+ extractUtmParameters,
289
+ initPersistCampaignData
290
+ };
@@ -0,0 +1,5 @@
1
+ // NoBounce module exports
2
+ export * from './nobounce';
3
+
4
+ // Re-export default
5
+ export { default } from './nobounce';