@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.
- package/docs/campaign-guide.md +234 -0
- package/examples/campaign-examples.js +126 -0
- package/examples/nobounce-examples.js +280 -0
- package/index.js +2 -0
- package/lib/campaign/index.js +5 -0
- package/lib/campaign/persist-campaign-data.js +162 -0
- package/lib/campaign/types.d.ts +290 -0
- package/lib/nobounce/index.js +5 -0
- package/lib/nobounce/nobounce.js +336 -0
- package/lib/nobounce/types.d.ts +255 -0
- package/package.json +20 -1
- package/lib/calltouch/fixed_calltouch_module.js +0 -312
- package/lib/calltouch/fixed_create_request.js +0 -176
- package/lib/fixed_analytics.js +0 -240
- package/lib/fixed_form.js +0 -443
|
@@ -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
|
+
};
|