hina-cloud-js-sdk 3.1.8 → 4.0.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.
Files changed (58) hide show
  1. package/dist/hina.cjs.js +1 -0
  2. package/dist/hina.esm.full.js +1 -0
  3. package/dist/hina.esm.js +1 -0
  4. package/dist/hina.full.js +1 -0
  5. package/dist/hina.iife.js +1 -0
  6. package/dist/index.d.ts +411 -0
  7. package/package.json +28 -38
  8. package/readme.md +1 -0
  9. package/.eslintrc.js +0 -12
  10. package/.gitlab-ci.yml +0 -16
  11. package/.vscode/settings.json +0 -5
  12. package/build/hina.cjs.min.js +0 -1
  13. package/build/hina.esm.min.js +0 -1
  14. package/build/hina.min.js +0 -1
  15. package/build/hotAnalyse.min.js +0 -1
  16. package/packages/core/dist/index.cjs.js +0 -64
  17. package/packages/core/dist/index.cjs.js.map +0 -1
  18. package/packages/core/dist/index.d.ts +0 -45
  19. package/packages/core/dist/index.esm.js +0 -62
  20. package/packages/core/dist/index.esm.js.map +0 -1
  21. package/packages/core/dist/index.global.js +0 -1199
  22. package/packages/core/dist/index.global.js.map +0 -1
  23. package/packages/core/dist/index.js +0 -1200
  24. package/packages/core/dist/index.js.map +0 -1
  25. package/packages/monitor/dist/index.cjs.js +0 -150
  26. package/packages/monitor/dist/index.cjs.js.map +0 -1
  27. package/packages/monitor/dist/index.d.ts +0 -35
  28. package/packages/monitor/dist/index.esm.js +0 -145
  29. package/packages/monitor/dist/index.esm.js.map +0 -1
  30. package/packages/monitor/dist/index.global.js +0 -1343
  31. package/packages/monitor/dist/index.global.js.map +0 -1
  32. package/packages/monitor/dist/index.js +0 -1344
  33. package/packages/monitor/dist/index.js.map +0 -1
  34. package/packages/track/dist/index.cjs.js +0 -1930
  35. package/packages/track/dist/index.cjs.js.map +0 -1
  36. package/packages/track/dist/index.d.ts +0 -212
  37. package/packages/track/dist/index.esm.js +0 -1925
  38. package/packages/track/dist/index.esm.js.map +0 -1
  39. package/packages/track/dist/index.global.js +0 -4259
  40. package/packages/track/dist/index.global.js.map +0 -1
  41. package/packages/track/dist/index.js +0 -4260
  42. package/packages/track/dist/index.js.map +0 -1
  43. package/packages/types/dist/index.d.ts +0 -603
  44. package/packages/types/dist/index.esm.js +0 -25
  45. package/packages/types/dist/index.esm.js.map +0 -1
  46. package/packages/utils/dist/index.cjs.js +0 -1535
  47. package/packages/utils/dist/index.cjs.js.map +0 -1
  48. package/packages/utils/dist/index.d.ts +0 -394
  49. package/packages/utils/dist/index.esm.js +0 -1465
  50. package/packages/utils/dist/index.esm.js.map +0 -1
  51. package/packages/utils/dist/index.global.js +0 -2507
  52. package/packages/utils/dist/index.global.js.map +0 -1
  53. package/packages/utils/dist/index.js +0 -2508
  54. package/packages/utils/dist/index.js.map +0 -1
  55. package/report.json +0 -101
  56. package/rollup.config.epm.js +0 -42
  57. package/rollup.config.sdk.js +0 -42
  58. package/sonar-project.properties +0 -3
@@ -1,1925 +0,0 @@
1
- import { BaseCore } from 'hina-cloud-core';
2
- import { ReportType, ConsoleTypes, PluginBase } from 'hina-cloud-types';
3
- import { safeJSONParse, isArray, nowStamp, AjaxRequest, base64Encode, getRandom, isFunction, isObject, merge, getElementParents, isElement, isString, getScrollLeft, getScrollTop, formatDecimal, getElementProperties, ListenPageState, mitt, getURL, getReferrer, getHostname, isBoolean, handleDecodeURLComponent, handleEncodeURLComponent, supportHistory, replaceOld, isNumber, getCurrentDomain, isReferralTraffic, SearchKeyword, getUmtsParams, State, BeaconRequest, ImageRequest, isEmptyObject, getPageProperties, getBrowserInfo, MAX_STRING_LENGTH, noop } from 'hina-cloud-utils';
4
-
5
- /******************************************************************************
6
- Copyright (c) Microsoft Corporation.
7
-
8
- Permission to use, copy, modify, and/or distribute this software for any
9
- purpose with or without fee is hereby granted.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- ***************************************************************************** */
19
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
20
-
21
- var extendStatics = function(d, b) {
22
- extendStatics = Object.setPrototypeOf ||
23
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
24
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
25
- return extendStatics(d, b);
26
- };
27
-
28
- function __extends(d, b) {
29
- if (typeof b !== "function" && b !== null)
30
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
31
- extendStatics(d, b);
32
- function __() { this.constructor = d; }
33
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
34
- }
35
-
36
- var __assign = function() {
37
- __assign = Object.assign || function __assign(t) {
38
- for (var s, i = 1, n = arguments.length; i < n; i++) {
39
- s = arguments[i];
40
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
41
- }
42
- return t;
43
- };
44
- return __assign.apply(this, arguments);
45
- };
46
-
47
- function __values(o) {
48
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
49
- if (m) return m.call(o);
50
- if (o && typeof o.length === "number") return {
51
- next: function () {
52
- if (o && i >= o.length) o = void 0;
53
- return { value: o && o[i++], done: !o };
54
- }
55
- };
56
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
57
- }
58
-
59
- function __read(o, n) {
60
- var m = typeof Symbol === "function" && o[Symbol.iterator];
61
- if (!m) return o;
62
- var i = m.call(o), r, ar = [], e;
63
- try {
64
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
65
- }
66
- catch (error) { e = { error: error }; }
67
- finally {
68
- try {
69
- if (r && !r.done && (m = i["return"])) m.call(i);
70
- }
71
- finally { if (e) throw e.error; }
72
- }
73
- return ar;
74
- }
75
-
76
- function __spreadArray(to, from, pack) {
77
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
78
- if (ar || !(i in from)) {
79
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
80
- ar[i] = from[i];
81
- }
82
- }
83
- return to.concat(ar || Array.prototype.slice.call(from));
84
- }
85
-
86
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
87
- var e = new Error(message);
88
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
89
- };
90
-
91
- var GET_DEFAULT_OPTIONS = function () {
92
- return {
93
- name: '',
94
- serverUrl: '',
95
- showLog: false,
96
- autoTrackConfig: {
97
- clickAutoTrack: true,
98
- stayAutoTrack: true,
99
- isCollectUrl: function () { return true; },
100
- isCollectElement: function () { return true; },
101
- isCollectInput: function () { return false; },
102
- addCustomProperty: function () { },
103
- stayDelayTime: 4000,
104
- maxStayPageDuration: 18000,
105
- collectTags: {
106
- div: false
107
- },
108
- trackAttr: ['hn-click'],
109
- pageviewAutoTrack: false,
110
- pageLeaveAutoTrack: false
111
- },
112
- stayAutoTrackConfig: {
113
- isCollectUrl: function () { return true; }
114
- },
115
- imgUseCrossOrigin: false,
116
- isSinglePage: false,
117
- batchSend: false,
118
- appJsBridge: false,
119
- sendType: ReportType.IMAGE,
120
- dataSendTimeout: 3000,
121
- presetProperties: {
122
- latest_utm: true,
123
- latest_utm_source: true,
124
- latest_traffic_source_type: true,
125
- latest_search_keyword: true,
126
- latest_referrer: true,
127
- url: true,
128
- title: true
129
- }
130
- };
131
- };
132
- var ignoreTags = [
133
- 'mark',
134
- '/mark',
135
- 'strong',
136
- 'b',
137
- 'em',
138
- 'i',
139
- 'u',
140
- 'abbr',
141
- 'ins',
142
- 'del',
143
- 's',
144
- 'sup'
145
- ];
146
- var defaultTags = ['a', 'input', 'button', 'textarea'];
147
-
148
- /**
149
- * @description 批量发送数据
150
- */
151
- var BatchSend = /** @class */ (function () {
152
- function BatchSend(context) {
153
- this.context = context;
154
- this.batchKey = 'hinasdk_tab';
155
- this.batchDataKey = 'hinasdk_data_';
156
- this.batchInterval();
157
- }
158
- BatchSend.prototype.getBatchConfig = function () {
159
- var batchSend = this.context.options.batchSend;
160
- return batchSend;
161
- };
162
- BatchSend.prototype.getStorageList = function () {
163
- var _a;
164
- var list = [];
165
- var tabStorage = (_a = this.context.store.localStorage) === null || _a === void 0 ? void 0 : _a.get(this.batchKey);
166
- if (tabStorage) {
167
- list = safeJSONParse(tabStorage);
168
- if (!isArray(list)) {
169
- list = [];
170
- }
171
- }
172
- return list;
173
- };
174
- BatchSend.prototype.batchInterval = function () {
175
- var _this = this;
176
- var sendInterval = this.getBatchConfig().sendInterval;
177
- setTimeout(function () {
178
- _this.send().then(function () {
179
- _this.batchInterval();
180
- });
181
- }, sendInterval);
182
- };
183
- BatchSend.prototype.send = function () {
184
- var _this = this;
185
- return new Promise(function (resolve) {
186
- var _a;
187
- var tabStorageList = _this.getStorageList();
188
- if (tabStorageList.length > 0) {
189
- var _b = _this.getBatchConfig(), storageLimit = _b.storageLimit, dataSendTimeout = _b.dataSendTimeout;
190
- var now = nowStamp();
191
- var list = [];
192
- var removeKeys_1 = [];
193
- var len = tabStorageList.length;
194
- for (var i = 0; i < len; i++) {
195
- var _c = tabStorageList[i], dataKey = _c.dataKey, expireTime = _c.expireTime;
196
- removeKeys_1.push(dataKey);
197
- if (expireTime >= now) {
198
- var data = (_a = _this.context.store.localStorage) === null || _a === void 0 ? void 0 : _a.get(dataKey);
199
- if (data) {
200
- list.push(safeJSONParse(data));
201
- }
202
- }
203
- }
204
- list = list.filter(Boolean);
205
- if (list.length > storageLimit) {
206
- list = list.slice(0, storageLimit);
207
- }
208
- if (list.length === 0) {
209
- resolve();
210
- }
211
- else {
212
- var serverUrl = _this.context.options.serverUrl;
213
- var listStr = JSON.stringify(list);
214
- new AjaxRequest({
215
- url: serverUrl,
216
- data: "data_list=".concat(base64Encode(listStr)),
217
- timeout: dataSendTimeout
218
- })
219
- .run()
220
- .then(function (res) {
221
- if (res.type === 'success') {
222
- _this.remove(removeKeys_1);
223
- }
224
- resolve();
225
- });
226
- }
227
- }
228
- });
229
- };
230
- BatchSend.prototype.remove = function (removeKeys) {
231
- var _this = this;
232
- var _a;
233
- var firstKey = removeKeys[0];
234
- var tabStorageList = this.getStorageList();
235
- // 删除hinasdk_data_开头的数据
236
- removeKeys.forEach(function (key) {
237
- var _a;
238
- (_a = _this.context.store.localStorage) === null || _a === void 0 ? void 0 : _a.remove(key);
239
- });
240
- // 删除hinasdk_tab数据
241
- var index = tabStorageList.findIndex(function (item) { return item.dataKey === firstKey; });
242
- if (index >= 0) {
243
- var list = tabStorageList.slice(0, index);
244
- (_a = this.context.store.localStorage) === null || _a === void 0 ? void 0 : _a.set(this.batchKey, JSON.stringify(list));
245
- }
246
- };
247
- BatchSend.prototype.add = function (data) {
248
- var _a, _b;
249
- var _c = this.getBatchConfig(), sendInterval = _c.sendInterval, storageLimit = _c.storageLimit;
250
- var dataKey = this.batchDataKey + getRandom();
251
- var tabStorage = this.getStorageList();
252
- tabStorage.unshift({
253
- dataKey: dataKey,
254
- expireTime: nowStamp() + sendInterval * 2
255
- });
256
- (_a = this.context.store.localStorage) === null || _a === void 0 ? void 0 : _a.set(this.batchKey, JSON.stringify(tabStorage));
257
- (_b = this.context.store.localStorage) === null || _b === void 0 ? void 0 : _b.set(dataKey, JSON.stringify(data));
258
- /**
259
- * 满足以下条件,则发送数据
260
- * 1. localStorage 条数超过最大限制
261
- * 2. 发送类型为 track_signup 或 H_pageview
262
- */
263
- if (tabStorage.length > storageLimit ||
264
- data.type === 'track_signup' ||
265
- data.event === 'H_pageview') {
266
- this.send();
267
- }
268
- };
269
- return BatchSend;
270
- }());
271
-
272
- var ClickTrackPlugin = /** @class */ (function (_super) {
273
- __extends(ClickTrackPlugin, _super);
274
- function ClickTrackPlugin(options, context) {
275
- var _this = _super.call(this, options, context) || this;
276
- _this.options = options;
277
- _this.context = context;
278
- /**
279
- * 插件名
280
- */
281
- _this.name = 'ClickTrackPlugin';
282
- /**
283
- * 默认采集标签
284
- */
285
- _this.isTrackList = {
286
- a: true,
287
- button: true
288
- };
289
- return _this;
290
- }
291
- ClickTrackPlugin.prototype.init = function (notify) {
292
- var _this = this;
293
- var _a = this.options.autoTrackConfig, clickAutoTrack = _a.clickAutoTrack, isCollectUrl = _a.isCollectUrl, isCollectElement = _a.isCollectElement, addCustomProperty = _a.addCustomProperty;
294
- if (clickAutoTrack !== true)
295
- return;
296
- document.addEventListener('click', function (e) {
297
- if (!isCollectUrl())
298
- return;
299
- var event = e || window.event;
300
- if (!event)
301
- return;
302
- var eventTarget = event.target || event.srcElement;
303
- var target = _this.getTargetElement(eventTarget, event);
304
- if (target) {
305
- // 判断是否要上报此元素的点击事件
306
- if (isFunction(isCollectElement) && !isCollectElement(target)) {
307
- return false;
308
- }
309
- var props = _this.getClickElementInfo(target);
310
- var _a = _this.getPageXYInfo(event, target), H_page_x = _a.H_page_x, H_page_y = _a.H_page_y;
311
- props.H_page_x = H_page_x;
312
- props.H_page_y = H_page_y;
313
- if (isFunction(addCustomProperty)) {
314
- var customProperty = addCustomProperty(target);
315
- if (isObject(customProperty)) {
316
- props = merge(props, customProperty);
317
- }
318
- }
319
- notify(props);
320
- }
321
- }, true);
322
- };
323
- ClickTrackPlugin.prototype.transform = function (data) {
324
- var props = this.context.getReportData('track', 'H_WebClick', data);
325
- return props;
326
- };
327
- ClickTrackPlugin.prototype.hasAttribute = function (element, attrName) {
328
- var _a;
329
- if (element.hasAttribute) {
330
- return element.hasAttribute(attrName);
331
- }
332
- if (element.attributes) {
333
- return !!((_a = element.attributes[attrName]) === null || _a === void 0 ? void 0 : _a.value);
334
- }
335
- };
336
- ClickTrackPlugin.prototype.hasAttributes = function (element, attrNames) {
337
- if (isArray(attrNames)) {
338
- for (var i = 0; i < attrNames.length; i++) {
339
- if (this.hasAttribute(element, attrNames[i])) {
340
- return true;
341
- }
342
- }
343
- }
344
- return false;
345
- };
346
- ClickTrackPlugin.prototype.hasElement = function (element) {
347
- var e_1, _a;
348
- var _b;
349
- var paths = getElementParents(element);
350
- var trackAttr = this.options.autoTrackConfig.trackAttr || [];
351
- if (isArray(paths) && paths.length > 0) {
352
- try {
353
- for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
354
- var path = paths_1_1.value;
355
- var tagName = (_b = path.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase();
356
- if (isElement(path) &&
357
- (this.isTrackList[tagName] || this.hasAttributes(path, trackAttr))) {
358
- return path;
359
- }
360
- }
361
- }
362
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
363
- finally {
364
- try {
365
- if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
366
- }
367
- finally { if (e_1) throw e_1.error; }
368
- }
369
- }
370
- };
371
- ClickTrackPlugin.prototype.getDivMaxLevel = function () {
372
- var _a;
373
- var collectTags = this.options.autoTrackConfig.collectTags;
374
- return ((_a = collectTags.div) === null || _a === void 0 ? void 0 : _a.maxLevel) || 1;
375
- };
376
- /**
377
- * 针对div标签,判断是否是忽略的样式标签
378
- * @param tagName
379
- */
380
- ClickTrackPlugin.prototype.isStyleTag = function (tagName) {
381
- var _a;
382
- var collectTags = this.options.autoTrackConfig.collectTags;
383
- var ignoreTags = ((_a = collectTags.div) === null || _a === void 0 ? void 0 : _a.ignoreTags) || [];
384
- return ignoreTags === null || ignoreTags === void 0 ? void 0 : ignoreTags.includes(tagName);
385
- };
386
- /**
387
- * 获取可采集元素的父元素
388
- * @param target
389
- */
390
- ClickTrackPlugin.prototype.getCollectableParent = function (target) {
391
- var _a;
392
- try {
393
- var parentNode = target.parentNode;
394
- var parentTagName = parentNode ? (_a = parentNode.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase() : '';
395
- if (parentTagName === 'body') {
396
- return false;
397
- }
398
- var maxLevel = this.getDivMaxLevel();
399
- if (parentTagName === 'div' &&
400
- (maxLevel > 1 || this.isCollectableDiv(parentNode))) {
401
- return parentNode;
402
- }
403
- if (parentNode && this.isStyleTag(parentTagName)) {
404
- return this.getCollectableParent(parentNode);
405
- }
406
- }
407
- catch (error) {
408
- this.context.log(error, ConsoleTypes.ERROR);
409
- }
410
- return false;
411
- };
412
- /**
413
- * 是否是可以收集的div
414
- * @param element
415
- */
416
- ClickTrackPlugin.prototype.isCollectableDiv = function (element) {
417
- var _a;
418
- try {
419
- var children = element.children || [];
420
- if (children.length === 0) {
421
- return true;
422
- }
423
- for (var i = 0; i < children.length; i++) {
424
- var child = children[i];
425
- if (isElement(child)) {
426
- var tagName = (_a = child.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
427
- var maxLevel = this.getDivMaxLevel();
428
- if ((tagName === 'div' && maxLevel > 1) || this.isStyleTag(tagName)) {
429
- if (!this.isCollectableDiv(child)) {
430
- return false;
431
- }
432
- }
433
- else {
434
- return false;
435
- }
436
- }
437
- }
438
- return true;
439
- }
440
- catch (error) {
441
- this.context.log(error, ConsoleTypes.ERROR);
442
- }
443
- return false;
444
- };
445
- /**
446
- * 判断div的层级是否有效
447
- * @param rootElement
448
- */
449
- ClickTrackPlugin.prototype.isDivLevelValid = function (rootElement) {
450
- var maxLevel = this.getDivMaxLevel();
451
- var htmlCollection = rootElement.getElementsByTagName('div');
452
- for (var i = htmlCollection.length - 1; i >= 0; i--) {
453
- if (this.getDivLevels(htmlCollection[i], rootElement) > maxLevel) {
454
- return false;
455
- }
456
- }
457
- return true;
458
- };
459
- /**
460
- * 获取指定元素的路径
461
- * @param element 当前元素
462
- * @param ignoreId 是否忽略id
463
- * @param rootElement 根元素
464
- */
465
- ClickTrackPlugin.prototype.getElementPath = function (element, ignoreId, rootElement) {
466
- var _a, _b;
467
- var names = [];
468
- while (isElement(element) && element.parentNode) {
469
- if (element.id &&
470
- !ignoreId &&
471
- /^[A-Za-z][-A-Za-z0-9_:.]*$/.test(element.id)) {
472
- var tagName = element.tagName || '';
473
- names.unshift("".concat(tagName.toLowerCase(), "#").concat(element.id));
474
- break;
475
- }
476
- else {
477
- if (rootElement && element === rootElement) {
478
- names.unshift((_a = element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase());
479
- break;
480
- }
481
- else if (element === document.body) {
482
- names.unshift('body');
483
- break;
484
- }
485
- else {
486
- names.unshift((_b = element.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase());
487
- }
488
- element = element.parentNode;
489
- }
490
- }
491
- return names.join(' > ');
492
- };
493
- ClickTrackPlugin.prototype.getDivLevels = function (element, rootElement) {
494
- var path = this.getElementPath(element, true, rootElement);
495
- var pathArr = path.split(' > ');
496
- var level = 0;
497
- pathArr.forEach(function (tag) {
498
- if (tag === 'div') {
499
- level++;
500
- }
501
- });
502
- return level;
503
- };
504
- ClickTrackPlugin.prototype.getTargetElement = function (eventTarget, event) {
505
- var _a;
506
- if (!isElement(eventTarget)) {
507
- return null;
508
- }
509
- var tagName = (_a = eventTarget.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
510
- if (!isString(tagName)) {
511
- return null;
512
- }
513
- if (['body', 'html'].includes(tagName)) {
514
- return null;
515
- }
516
- if (this.context.trackTags.includes(tagName) && tagName !== 'div') {
517
- return eventTarget;
518
- }
519
- /**
520
- * div处理情况
521
- * 1.div为子结点(无子元素)时采集 div 的点击;
522
- * 2.div中有且只有样式标签([‘mark’,’strong’,’b’,’em’,’i’,’u’,’abbr’,’ins’,’del’,’s’,’sup’])时,点击 div 或者样式标签都采集 div 的点击。
523
- * 3.div 通过配置最多可以采集3层嵌套情况
524
- */
525
- if (tagName === 'div') {
526
- if (this.isDivLevelValid(eventTarget)) {
527
- var maxLevel = this.getDivMaxLevel();
528
- if (maxLevel > 1 || this.isCollectableDiv(eventTarget)) {
529
- return eventTarget;
530
- }
531
- }
532
- }
533
- if (this.isStyleTag(tagName) &&
534
- this.options.autoTrackConfig.collectTags.div) {
535
- var parentTrackDiv = this.getCollectableParent(eventTarget);
536
- if (parentTrackDiv && this.isDivLevelValid(parentTrackDiv)) {
537
- return parentTrackDiv;
538
- }
539
- }
540
- return this.hasElement(eventTarget) || null;
541
- };
542
- ClickTrackPlugin.prototype.getPageXYInfo = function (event, target) {
543
- if (!event) {
544
- return {};
545
- }
546
- var scrollLeft = getScrollLeft();
547
- var scrollTop = getScrollTop();
548
- var rect = target.getBoundingClientRect();
549
- var pageX = event.pageX ||
550
- event.clientX + scrollLeft ||
551
- event.offsetX + ((rect === null || rect === void 0 ? void 0 : rect.left) || 0) + scrollLeft;
552
- var pageY = event.pageY ||
553
- event.clientY + scrollTop ||
554
- event.offsetY + ((rect === null || rect === void 0 ? void 0 : rect.top) || 0) + scrollTop;
555
- return {
556
- H_page_x: formatDecimal(pageX, 3),
557
- H_page_y: formatDecimal(pageY, 3)
558
- };
559
- };
560
- ClickTrackPlugin.prototype.getClickElementInfo = function (element) {
561
- var isCollectInput = this.options.autoTrackConfig.isCollectInput;
562
- var isCollectInputValue = false;
563
- if (isFunction(isCollectInput)) {
564
- isCollectInputValue = isCollectInput(element);
565
- }
566
- var selector = this.getDomSelector(element);
567
- var props = getElementProperties(element, isCollectInputValue);
568
- props.H_element_selector = selector;
569
- props.H_element_path = this.getElementPath(element, false);
570
- return props;
571
- };
572
- ClickTrackPlugin.prototype.getDomSelector = function (element) {
573
- var _a;
574
- var paths = [];
575
- while (element) {
576
- var tagName = (_a = element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
577
- if (tagName === 'body' || !isElement(element)) {
578
- paths.unshift('body');
579
- break;
580
- }
581
- paths.unshift(this.getSelector(element));
582
- if ((element === null || element === void 0 ? void 0 : element.getAttribute('id')) &&
583
- /^[A-Za-z][-A-Za-z0-9_:.]*$/.test(element.getAttribute('id'))) {
584
- break;
585
- }
586
- element = element.parentNode;
587
- }
588
- return paths.join(' > ');
589
- };
590
- ClickTrackPlugin.prototype.getSelector = function (element) {
591
- var _a, _b;
592
- var tagName = (_a = element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
593
- var i = -1;
594
- if (((_b = element.parentNode) === null || _b === void 0 ? void 0 : _b.nodeType) !== 9) {
595
- i = this.getDomIndex(element);
596
- }
597
- var idValue = element.getAttribute('id');
598
- if (idValue && /^[A-Za-z][-A-Za-z0-9_:.]*$/.test(idValue)) {
599
- return "#".concat(idValue);
600
- }
601
- return tagName + (i > -1 ? ":nth-of-type(".concat(i + 1, ")") : '');
602
- };
603
- ClickTrackPlugin.prototype.getDomIndex = function (element) {
604
- var _a, _b;
605
- if (element.parentNode) {
606
- var index = 0;
607
- var tagName = (_a = element.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
608
- var children = element.parentNode.children;
609
- for (var i = 0; i < children.length; i++) {
610
- var child = children[i];
611
- var childTagName = (_b = child.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase();
612
- if (childTagName === tagName) {
613
- if (child === element) {
614
- return index;
615
- }
616
- index++;
617
- }
618
- }
619
- }
620
- return -1;
621
- };
622
- return ClickTrackPlugin;
623
- }(PluginBase));
624
-
625
- var StayTrackPlugin = /** @class */ (function (_super) {
626
- __extends(StayTrackPlugin, _super);
627
- function StayTrackPlugin(options, context) {
628
- var _this = _super.call(this, options, context) || this;
629
- _this.options = options;
630
- _this.context = context;
631
- _this.name = 'StayTrackPlugin';
632
- _this.timer = null;
633
- _this.previousTime = nowStamp();
634
- _this.previousOffsetTop = 0;
635
- return _this;
636
- }
637
- StayTrackPlugin.prototype.init = function (notify) {
638
- var _this = this;
639
- var _a = this.options, autoTrackConfig = _a.autoTrackConfig, stayAutoTrackConfig = _a.stayAutoTrackConfig;
640
- if (autoTrackConfig.stayAutoTrack !== true) {
641
- return;
642
- }
643
- var isCollectUrl = stayAutoTrackConfig.isCollectUrl;
644
- if (!isFunction(isCollectUrl)) {
645
- isCollectUrl = function () { return true; };
646
- }
647
- if (this.timer) {
648
- clearTimeout(this.timer);
649
- this.timer = null;
650
- }
651
- this.previousTime = nowStamp();
652
- window.addEventListener('load', function () {
653
- _this.previousOffsetTop = getScrollTop();
654
- });
655
- window.addEventListener('scroll', function () {
656
- if (!isCollectUrl())
657
- return;
658
- if (_this.timer)
659
- return;
660
- _this.timer = setTimeout(function () {
661
- _this.run(notify);
662
- clearTimeout(_this.timer);
663
- _this.timer = null;
664
- }, 1000);
665
- });
666
- window.addEventListener('unload', function () {
667
- if (!isCollectUrl())
668
- return;
669
- _this.run(notify, true);
670
- });
671
- };
672
- StayTrackPlugin.prototype.transform = function (data) {
673
- var props = this.context.getReportData('track', 'H_WebStay', data);
674
- return props;
675
- };
676
- StayTrackPlugin.prototype.run = function (notify, isClosePage) {
677
- if (isClosePage === void 0) { isClosePage = false; }
678
- var autoTrackConfig = this.options.autoTrackConfig;
679
- var stayDelayTime = autoTrackConfig.stayDelayTime, maxStayPageDuration = autoTrackConfig.maxStayPageDuration;
680
- var offsetTop = getScrollTop();
681
- var nowTime = nowStamp();
682
- var duration = nowTime - this.previousTime;
683
- if (isClosePage ||
684
- (duration > stayDelayTime && offsetTop !== this.previousOffsetTop)) {
685
- var props = {
686
- H_viewport_position: this.previousOffsetTop,
687
- event_duration: Math.min(duration / 1000, maxStayPageDuration)
688
- };
689
- notify(props);
690
- }
691
- this.previousTime = nowTime;
692
- this.previousOffsetTop = offsetTop;
693
- };
694
- return StayTrackPlugin;
695
- }(PluginBase));
696
-
697
- var PageLeavePluginName = 'PageLeavePlugin';
698
- var PageLeavePlugin = /** @class */ (function (_super) {
699
- __extends(PageLeavePlugin, _super);
700
- function PageLeavePlugin(options, context) {
701
- var _this = _super.call(this, options, context) || this;
702
- _this.options = options;
703
- _this.context = context;
704
- _this.name = PageLeavePluginName;
705
- _this.pageId = Number(String(getRandom()).slice(2, 5) +
706
- String(getRandom()).slice(2, 4) +
707
- String(nowStamp()).slice(-4));
708
- _this.storageName = 'hinasdk_pageleave_';
709
- _this.heartbeatIntervalTime = 5000; // 5s
710
- _this.maxDuration = 432000; // 5天
711
- _this.heartbeatIntervalTimer = null;
712
- _this.startTime = nowStamp();
713
- /**
714
- * 页面url
715
- */
716
- _this.url = window.location.href;
717
- /**
718
- * 上一个页面url
719
- */
720
- _this.previousUrl = document.referrer;
721
- /**
722
- * 页面显示状态
723
- */
724
- _this.pageShowStatus = true;
725
- return _this;
726
- }
727
- PageLeavePlugin.prototype.init = function () {
728
- var pageLeaveAutoTrack = this.options.autoTrackConfig.pageLeaveAutoTrack;
729
- if (!pageLeaveAutoTrack)
730
- return;
731
- var _a = this.normalizePageLeaveAutoTrack(), heartbeat_interval_time = _a.heartbeat_interval_time, max_duration = _a.max_duration;
732
- if (heartbeat_interval_time && heartbeat_interval_time > 0) {
733
- this.heartbeatIntervalTime = heartbeat_interval_time * 1000;
734
- }
735
- if (max_duration && max_duration > 0) {
736
- this.maxDuration = Number(max_duration);
737
- }
738
- this.startTime = nowStamp();
739
- this.addPageLeaveEventListener();
740
- if (document.hidden) {
741
- this.pageShowStatus = false;
742
- }
743
- else {
744
- this.addHeartBeatInterval();
745
- }
746
- };
747
- PageLeavePlugin.prototype.transform = function (data) {
748
- return undefined;
749
- };
750
- PageLeavePlugin.prototype.normalizePageLeaveAutoTrack = function () {
751
- var pageLeaveAutoTrack = this.options.autoTrackConfig.pageLeaveAutoTrack;
752
- return isObject(pageLeaveAutoTrack)
753
- ? pageLeaveAutoTrack
754
- : {};
755
- };
756
- PageLeavePlugin.prototype.addPageLeaveEventListener = function () {
757
- this.addPageStartListener();
758
- this.addPageSwitchListener();
759
- this.addSinglePageListener();
760
- this.addPageEndListener();
761
- };
762
- PageLeavePlugin.prototype.addPageStartListener = function () {
763
- var _this = this;
764
- if ('onpageshow' in window) {
765
- window.addEventListener('pageshow', function () {
766
- _this.pageStartHandler();
767
- });
768
- }
769
- };
770
- PageLeavePlugin.prototype.addPageSwitchListener = function () {
771
- var _this = this;
772
- new ListenPageState({
773
- visible: function () {
774
- _this.pageStartHandler();
775
- _this.addHeartBeatInterval();
776
- },
777
- hidden: function () {
778
- _this.url = window.location.href;
779
- _this.pageEndHandler();
780
- _this.stopHeartBeatInterval();
781
- }
782
- });
783
- };
784
- PageLeavePlugin.prototype.addSinglePageListener = function () {
785
- var _this = this;
786
- mitt.on('urlChange', function (params) {
787
- var fromHref = params.fromHref;
788
- if (fromHref !== window.location.href) {
789
- _this.url = fromHref;
790
- _this.pageEndHandler();
791
- _this.stopHeartBeatInterval();
792
- _this.pageStartHandler();
793
- _this.addHeartBeatInterval();
794
- }
795
- });
796
- };
797
- PageLeavePlugin.prototype.addPageEndListener = function () {
798
- var _this = this;
799
- var events = ['pagehide', 'beforeunload', 'unload'];
800
- events.forEach(function (event) {
801
- if ("on".concat(events) in window) {
802
- window.addEventListener(event, function () {
803
- _this.pageEndHandler();
804
- _this.stopHeartBeatInterval();
805
- });
806
- }
807
- });
808
- };
809
- PageLeavePlugin.prototype.pageStartHandler = function () {
810
- this.startTime = nowStamp();
811
- this.pageShowStatus = !document.hidden;
812
- this.url = window.location.href;
813
- };
814
- PageLeavePlugin.prototype.pageEndHandler = function () {
815
- if (!this.pageShowStatus)
816
- return;
817
- this.pageShowStatus = false;
818
- if (this.isCollectUrl()) {
819
- var properties = this.getPageLeaveProperties();
820
- var data = this.context.getReportData('track', 'H_WebPageLeave', properties);
821
- this.context.report(data);
822
- }
823
- this.delHeartBeatData();
824
- };
825
- PageLeavePlugin.prototype.addHeartBeatInterval = function () {
826
- if (!this.context.store.localStorage)
827
- return;
828
- this.startHeartBeatInterval();
829
- };
830
- PageLeavePlugin.prototype.startHeartBeatInterval = function () {
831
- var _this = this;
832
- if (this.heartbeatIntervalTimer) {
833
- this.stopHeartBeatInterval();
834
- }
835
- if (this.isCollectUrl()) {
836
- this.heartbeatIntervalTimer = setInterval(function () {
837
- _this.saveHeartBeatData();
838
- }, this.heartbeatIntervalTime);
839
- this.saveHeartBeatData('first_heartbeat');
840
- }
841
- this.reissueHeartBeatData();
842
- };
843
- PageLeavePlugin.prototype.reissueHeartBeatData = function () {
844
- var localStorage = this.context.store.localStorage;
845
- var storageLen = localStorage.length();
846
- for (var i = 0; i < storageLen; i++) {
847
- var itemKey = localStorage.key(i);
848
- if (itemKey &&
849
- itemKey !== this.storageName + this.pageId &&
850
- itemKey.includes(this.storageName)) {
851
- var value = localStorage.get(itemKey);
852
- var result = safeJSONParse(value);
853
- if (isObject(result) &&
854
- nowStamp() - result.time > result.heartbeat_interval_time + 5000) {
855
- delete result.heartbeat_interval_time;
856
- this.context.report(result);
857
- }
858
- this.delHeartBeatData(itemKey);
859
- }
860
- }
861
- };
862
- PageLeavePlugin.prototype.stopHeartBeatInterval = function () {
863
- if (this.heartbeatIntervalTimer) {
864
- clearInterval(this.heartbeatIntervalTimer);
865
- this.heartbeatIntervalTimer = null;
866
- }
867
- };
868
- PageLeavePlugin.prototype.delHeartBeatData = function (storageKey) {
869
- if (this.context.store.localStorage) {
870
- this.context.store.localStorage.remove(storageKey || this.storageName + this.pageId);
871
- }
872
- };
873
- PageLeavePlugin.prototype.isCollectUrl = function () {
874
- var isCollectUrl = this.normalizePageLeaveAutoTrack().isCollectUrl;
875
- if (isFunction(isCollectUrl)) {
876
- return isCollectUrl(this.url);
877
- }
878
- return true;
879
- };
880
- PageLeavePlugin.prototype.saveHeartBeatData = function (type) {
881
- var properties = this.getPageLeaveProperties();
882
- properties.H_time = nowStamp();
883
- if (type === 'first_heartbeat') {
884
- properties.event_duration = 3;
885
- }
886
- var props = this.context.getReportData('track', 'H_WebPageLeave', properties);
887
- props.heartbeat_interval_time = this.heartbeatIntervalTime;
888
- this.context.store.localStorage.set(this.storageName + this.pageId, JSON.stringify(props));
889
- };
890
- PageLeavePlugin.prototype.getPageLeaveProperties = function () {
891
- var duration = (nowStamp() - this.startTime) / 1000;
892
- if (duration <= 0 || duration > this.maxDuration) {
893
- duration = 0;
894
- }
895
- else {
896
- duration = formatDecimal(duration, 3);
897
- }
898
- var _a = getURL(this.url), pathname = _a.pathname, hash = _a.hash;
899
- var referrer = getReferrer(this.previousUrl);
900
- var properties = {
901
- H_url: this.url,
902
- H_url_path: pathname,
903
- H_url_hash: hash,
904
- H_referrer: referrer,
905
- H_referrer_host: referrer ? getHostname(referrer) : ''
906
- };
907
- if (duration) {
908
- properties.event_duration = duration;
909
- }
910
- var custom_props = this.normalizePageLeaveAutoTrack().custom_props;
911
- if (isObject(custom_props)) {
912
- properties = __assign(__assign({}, properties), (custom_props || {}));
913
- }
914
- return properties;
915
- };
916
- return PageLeavePlugin;
917
- }(PluginBase));
918
-
919
- var SiteLinkerPluginName = 'SiteLinkerPlugin';
920
- var SiteLinkerPlugin = /** @class */ (function (_super) {
921
- __extends(SiteLinkerPlugin, _super);
922
- function SiteLinkerPlugin(options, context) {
923
- var _this = _super.call(this, options, context) || this;
924
- _this.options = options;
925
- _this.context = context;
926
- _this.name = SiteLinkerPluginName;
927
- _this.linker = [];
928
- return _this;
929
- }
930
- SiteLinkerPlugin.prototype.init = function () {
931
- var linker = this.getLinkerConfig().linker;
932
- if (!(isArray(linker) && linker.length > 0)) {
933
- this.context.log('siteLinker plugin: Please configure the linker parameter', ConsoleTypes.WARN);
934
- return;
935
- }
936
- // 处理配置
937
- this.resolveOption();
938
- this.setRefferId();
939
- this.addClickListen();
940
- };
941
- SiteLinkerPlugin.prototype.transform = function () {
942
- return undefined;
943
- };
944
- SiteLinkerPlugin.prototype.getLinkerConfig = function () {
945
- var _a = this.options.siteLinkerConfig || {}, _b = _a.linker, linker = _b === void 0 ? [] : _b, re_login = _a.re_login;
946
- return {
947
- linker: linker || [],
948
- re_login: re_login
949
- };
950
- };
951
- SiteLinkerPlugin.prototype.resolveOption = function () {
952
- var linker = this.getLinkerConfig().linker;
953
- var len = linker.length;
954
- var arr = [];
955
- for (var i = 0; i < len; i++) {
956
- var _a = linker[i], part_url = _a.part_url, after_hash = _a.after_hash;
957
- if (/[A-Za-z0-9]+\./.test(part_url) && isBoolean(after_hash)) {
958
- arr.push({
959
- part_url: part_url,
960
- after_hash: after_hash
961
- });
962
- }
963
- else {
964
- this.context.log("The configuration of linker ".concat(i + 1, " is not supported.Please check format"), ConsoleTypes.WARN);
965
- }
966
- }
967
- this.linker = arr;
968
- };
969
- /**
970
- * 多域名打通设置
971
- */
972
- SiteLinkerPlugin.prototype.setRefferId = function () {
973
- var re_login = this.getLinkerConfig().re_login;
974
- var urlId = this.getUrlId();
975
- var isAnonymousId = urlId.startsWith('a');
976
- urlId = urlId.substring(1);
977
- if (urlId === '')
978
- return;
979
- var anonymousId = this.context.store.getAnonymousId();
980
- var accountId = this.context.store.getAccountId();
981
- if (isAnonymousId) {
982
- if (urlId !== anonymousId) {
983
- this.context.store.state.anonymousId = urlId;
984
- this.context.store.save();
985
- }
986
- if (accountId) {
987
- var props = this.context.getReportData('track_signup', 'H_SignUp', {});
988
- this.context.report(props);
989
- }
990
- }
991
- else if (!accountId || (re_login && accountId !== urlId)) {
992
- this.context.setUserUId(urlId);
993
- }
994
- };
995
- /**
996
- * 获取链接上的id
997
- */
998
- SiteLinkerPlugin.prototype.getUrlId = function () {
999
- /**
1000
- * 匿名ID:a 登录ID:u
1001
- * 如果是匿名ID:返回的是a+匿名ID 如果是登录ID:返回的是u+登录ID
1002
- */
1003
- var hnId = window.location.href.match(/_hnsdk=([au][^\?\#\&\=]+)/);
1004
- if (isArray(hnId) && hnId[1]) {
1005
- return handleDecodeURLComponent(hnId[1]);
1006
- }
1007
- return '';
1008
- };
1009
- /**
1010
- * 判断url链接是否包含part_url
1011
- * @param url
1012
- */
1013
- SiteLinkerPlugin.prototype.getPartUrl = function (url) {
1014
- var len = this.linker.length;
1015
- for (var i = 0; i < len; i++) {
1016
- if (url.includes(this.linker[i].part_url)) {
1017
- return true;
1018
- }
1019
- }
1020
- return false;
1021
- };
1022
- /**
1023
- * 获取url链接对应的linker配置中after_hash的值
1024
- * @param url
1025
- */
1026
- SiteLinkerPlugin.prototype.getPartHash = function (url) {
1027
- var len = this.linker.length;
1028
- for (var i = 0; i < len; i++) {
1029
- if (url.includes(this.linker[i].part_url)) {
1030
- return this.linker[i].after_hash;
1031
- }
1032
- }
1033
- return false;
1034
- };
1035
- /**
1036
- * 获取当前的匿名ID和当前的登录ID
1037
- */
1038
- SiteLinkerPlugin.prototype.getCurrentId = function () {
1039
- var accountId = this.context.store.getAccountId();
1040
- var anonymousId = this.context.store.getAnonymousId();
1041
- var hnId = accountId ? "u".concat(accountId) : "a".concat(anonymousId);
1042
- return handleEncodeURLComponent(hnId);
1043
- };
1044
- /**
1045
- * 重写a 标签的href链接
1046
- * @param url
1047
- * @param dom
1048
- */
1049
- SiteLinkerPlugin.prototype.rewriteUrl = function (url, dom) {
1050
- /**
1051
- * ([^?#]+):匹配直到遇到 ? 或 # 之前的任何字符,并将这部分捕获为第一组。
1052
- * (\?[^#]*)?:可选地匹配 ? 后面直到遇到 # 之前的任何字符,并将这部分捕获为第二组。
1053
- * (#.*)?:可选地匹配 # 后面的任何字符,并将这部分捕获为第三组。
1054
- */
1055
- var reg = /([^?#]+)(\?[^#]*)?(#.*)?/;
1056
- var arr = reg.exec(url);
1057
- var normalizeUrl = '';
1058
- if (!arr)
1059
- return;
1060
- var host = arr[1] || ''; // 'http://www.xx.com'
1061
- var search = arr[2] || ''; // '?xxx=xxx'
1062
- var hash = arr[3] || ''; // '#xxx=xxx'
1063
- var hnId = "_hnsdk=".concat(this.getCurrentId());
1064
- var changeHnId = function (str) {
1065
- var list = str.split('&');
1066
- var result = [];
1067
- list.forEach(function (value) {
1068
- if (value.includes('_hnsdk')) {
1069
- result.push(hnId);
1070
- }
1071
- else {
1072
- result.push(value);
1073
- }
1074
- });
1075
- return result.join('&');
1076
- };
1077
- if (this.getPartHash(url)) {
1078
- var hasQuery = hash.includes('?'); // 判断是#xxx?xxx=xxx的格式
1079
- var index = hash.indexOf('_hnsdk');
1080
- if (hasQuery) {
1081
- if (index >= 0) {
1082
- normalizeUrl = "".concat(host).concat(search, "#").concat(hash.substring(1, index)).concat(changeHnId(hash.substring(index, hash.length)));
1083
- }
1084
- else {
1085
- normalizeUrl = "".concat(host).concat(search, "#").concat(hash.substring(1), "&").concat(hnId);
1086
- }
1087
- }
1088
- else {
1089
- normalizeUrl = "".concat(host).concat(search, "#").concat(hash.substring(1), "?").concat(hnId);
1090
- }
1091
- }
1092
- else {
1093
- var hasQuery = /^\?(\w)+/.test(search); // 判断是否有?xxx=xxx的格式
1094
- if (hasQuery) {
1095
- if (search.includes('_hnsdk')) {
1096
- normalizeUrl = "".concat(host, "?").concat(changeHnId(search.substring(1))).concat(hash);
1097
- }
1098
- else {
1099
- normalizeUrl = "".concat(host).concat(search, "&").concat(hnId).concat(hash);
1100
- }
1101
- }
1102
- else {
1103
- normalizeUrl = "".concat(host, "?").concat(hnId).concat(hash);
1104
- }
1105
- }
1106
- if (dom) {
1107
- dom.href = normalizeUrl;
1108
- }
1109
- return normalizeUrl;
1110
- };
1111
- SiteLinkerPlugin.prototype.addClickListen = function () {
1112
- var _this = this;
1113
- var handleClick = function (event) {
1114
- var _a, _b;
1115
- var target = event.target;
1116
- if (!target)
1117
- return;
1118
- var tagName = (_a = target.tagName) === null || _a === void 0 ? void 0 : _a.toLowerCase();
1119
- var parentNode = target.parentNode;
1120
- var parentTagName = (_b = parentNode === null || parentNode === void 0 ? void 0 : parentNode.tagName) === null || _b === void 0 ? void 0 : _b.toLowerCase();
1121
- if ((tagName === 'a' && target.href) ||
1122
- (parentTagName === 'a' && parentNode.href)) {
1123
- var sdkUrl = void 0;
1124
- var sdkTarget = void 0;
1125
- if (tagName === 'a' && target.href) {
1126
- sdkUrl = target.href;
1127
- sdkTarget = target;
1128
- }
1129
- else {
1130
- sdkUrl = parentNode.href;
1131
- sdkTarget = parentNode;
1132
- }
1133
- var protocol = getURL(sdkUrl).protocol;
1134
- if (protocol === 'http:' || protocol === 'https:') {
1135
- if (_this.getPartUrl(sdkUrl)) {
1136
- _this.rewriteUrl(sdkUrl, sdkTarget);
1137
- }
1138
- }
1139
- }
1140
- };
1141
- if ('PointerEvent' in window) {
1142
- document.addEventListener('pointerdown', handleClick);
1143
- }
1144
- else {
1145
- document.addEventListener('mousedown', handleClick);
1146
- }
1147
- };
1148
- return SiteLinkerPlugin;
1149
- }(PluginBase));
1150
-
1151
- var HistoryPlugin = /** @class */ (function (_super) {
1152
- __extends(HistoryPlugin, _super);
1153
- function HistoryPlugin(options, context) {
1154
- var _this = _super.call(this, options, context) || this;
1155
- _this.options = options;
1156
- _this.context = context;
1157
- _this.name = 'HistoryPlugin';
1158
- /**
1159
- * 上一次页面url
1160
- */
1161
- _this.lastHref = window.location.href;
1162
- /**
1163
- * 上一次路由path
1164
- */
1165
- _this.lastPath = window.location.pathname;
1166
- return _this;
1167
- }
1168
- HistoryPlugin.prototype.init = function (notify) {
1169
- if (!supportHistory())
1170
- return;
1171
- var _a = this.options, isSinglePage = _a.isSinglePage, pageviewAutoTrack = _a.autoTrackConfig.pageviewAutoTrack;
1172
- var self = this;
1173
- var originalOnpopstate = window.onpopstate;
1174
- var handleRouterChange = function (currentPath, currentHref) {
1175
- var params = {
1176
- fromPath: self.lastPath,
1177
- fromHref: self.lastHref,
1178
- toPath: currentPath,
1179
- toHref: currentHref
1180
- };
1181
- self.lastPath = currentPath;
1182
- self.lastHref = currentHref;
1183
- mitt.emit('urlChange', __assign(__assign({}, params), { mode: 'history' }));
1184
- if (isSinglePage || pageviewAutoTrack === 'singlePage') {
1185
- if (isFunction(isSinglePage)) {
1186
- var extra = isSinglePage();
1187
- if (isObject(extra)) {
1188
- params = __assign(__assign({}, params), extra);
1189
- }
1190
- }
1191
- notify(__assign(__assign({}, params), { H_referrer: self.lastHref }));
1192
- }
1193
- };
1194
- window.onpopstate = function () {
1195
- var args = [];
1196
- for (var _i = 0; _i < arguments.length; _i++) {
1197
- args[_i] = arguments[_i];
1198
- }
1199
- var currentPath = window.location.pathname;
1200
- var currentHref = window.location.href;
1201
- handleRouterChange(currentPath, currentHref);
1202
- originalOnpopstate && originalOnpopstate.apply(this, args);
1203
- };
1204
- function historyReplaceFn(originalHistoryFn) {
1205
- return function () {
1206
- var args = [];
1207
- for (var _i = 0; _i < arguments.length; _i++) {
1208
- args[_i] = arguments[_i];
1209
- }
1210
- var currentPath = args[2];
1211
- originalHistoryFn.apply(this, args);
1212
- var currentHref = window.location.href;
1213
- handleRouterChange(currentPath, currentHref);
1214
- };
1215
- }
1216
- replaceOld(window.history, 'pushState', historyReplaceFn);
1217
- replaceOld(window.history, 'replaceState', historyReplaceFn);
1218
- };
1219
- HistoryPlugin.prototype.transform = function (data) {
1220
- this.context.autoTrack(data);
1221
- return undefined;
1222
- };
1223
- return HistoryPlugin;
1224
- }(PluginBase));
1225
-
1226
- var HashPlugin = /** @class */ (function (_super) {
1227
- __extends(HashPlugin, _super);
1228
- function HashPlugin(options, context) {
1229
- var _this = _super.call(this, options, context) || this;
1230
- _this.options = options;
1231
- _this.context = context;
1232
- _this.name = 'HashPlugin';
1233
- /**
1234
- * 上一次页面url
1235
- */
1236
- _this.lastHref = window.location.href;
1237
- /**
1238
- * 上一次路由path
1239
- */
1240
- _this.lastPath = window.location.hash;
1241
- return _this;
1242
- }
1243
- HashPlugin.prototype.init = function (notify) {
1244
- var _this = this;
1245
- var _a = this.options, isSinglePage = _a.isSinglePage, pageviewAutoTrack = _a.autoTrackConfig.pageviewAutoTrack;
1246
- window.addEventListener('hashchange', function (event) {
1247
- var newURL = event.newURL;
1248
- var currentPath = getURL(newURL).hash;
1249
- var params = {
1250
- fromPath: _this.lastPath,
1251
- fromHref: _this.lastHref,
1252
- toPath: currentPath,
1253
- toHref: newURL
1254
- };
1255
- mitt.emit('urlChange', __assign(__assign({}, params), { mode: 'history' }));
1256
- _this.lastHref = newURL;
1257
- _this.lastPath = currentPath;
1258
- if (isSinglePage || pageviewAutoTrack === 'singlePage') {
1259
- if (isFunction(isSinglePage)) {
1260
- var extra = isSinglePage();
1261
- if (isObject(extra)) {
1262
- params = __assign(__assign({}, params), extra);
1263
- }
1264
- }
1265
- notify(__assign(__assign({}, params), { H_referrer: _this.lastHref }));
1266
- }
1267
- });
1268
- };
1269
- HashPlugin.prototype.transform = function (data) {
1270
- this.context.autoTrack(data);
1271
- return undefined;
1272
- };
1273
- return HashPlugin;
1274
- }(PluginBase));
1275
-
1276
- var HinaTrack = /** @class */ (function (_super) {
1277
- __extends(HinaTrack, _super);
1278
- function HinaTrack(options, useInstancing) {
1279
- if (useInstancing === void 0) { useInstancing = true; }
1280
- var _this = _super.call(this, options, useInstancing) || this;
1281
- /**
1282
- * 上报数据的dom元素 默认有 'a', 'input', 'button', 'textarea'
1283
- */
1284
- _this.trackTags = defaultTags;
1285
- /**
1286
- * 事件静态公共属性
1287
- */
1288
- _this.presetProps = {};
1289
- /**
1290
- * 插件列表
1291
- */
1292
- _this.plugins = [];
1293
- _this.consolePrefix = '埋点SDK';
1294
- // 使用new的方式初始化SDK,需要默认调用init方法进行初始化
1295
- if (_this.useInstancing) {
1296
- _this.init(options);
1297
- }
1298
- return _this;
1299
- }
1300
- /**
1301
- * 注册/初始化SDK
1302
- * @param options
1303
- */
1304
- HinaTrack.prototype.init = function (options) {
1305
- if (this.isReady) {
1306
- this.log('hinaSDK has been initialized', ConsoleTypes.ERROR);
1307
- return;
1308
- }
1309
- // 默认配置项
1310
- var default_config = GET_DEFAULT_OPTIONS();
1311
- // 将用户配置项和默认配置项合并
1312
- this.options = merge(default_config, options);
1313
- // 处理配置信息
1314
- this.normalizeConfig();
1315
- // 初始化state
1316
- this.initState();
1317
- // 处理广告参数
1318
- this.initAdvProps();
1319
- // 插件初始化
1320
- this.initPlugins();
1321
- // SDK初始化成功,一切准备就绪
1322
- this.isReady = true;
1323
- this.log('hinaSDK initialized successfully');
1324
- };
1325
- /**
1326
- * 处理配置信息
1327
- */
1328
- HinaTrack.prototype.normalizeConfig = function () {
1329
- var _a = this.options, serverUrl = _a.serverUrl, sendType = _a.sendType, batchSend = _a.batchSend, _b = _a.autoTrackConfig, _c = _b === void 0 ? {} : _b, _d = _c.trackAttr, trackAttr = _d === void 0 ? [] : _d, collectTags = _c.collectTags, pageLeaveAutoTrack = _c.pageLeaveAutoTrack, pageviewAutoTrack = _c.pageviewAutoTrack;
1330
- serverUrl = serverUrl || '';
1331
- serverUrl = serverUrl.trim();
1332
- if (serverUrl === '') {
1333
- this.log('当前 serverUrl 为空或不正确,network 中不会发数据,请配置正确的 serverUrl!', ConsoleTypes.WARN);
1334
- }
1335
- else {
1336
- var href = window.location.href;
1337
- var currentProtocol = getURL(href).protocol || '';
1338
- var serverProtocol = getURL(serverUrl).protocol || '';
1339
- if (serverProtocol !== currentProtocol) {
1340
- this.log('SDK 检测到您的数据发送地址和当前页面地址的协议不一致,建议您修改成一致的协议。因为:https 下面发送 http 的图片请求会失败。', ConsoleTypes.WARN);
1341
- }
1342
- }
1343
- if (![ReportType.IMAGE, ReportType.AJAX, ReportType.BEACON].includes(sendType)) {
1344
- this.setConfig({
1345
- sendType: ReportType.IMAGE
1346
- });
1347
- }
1348
- // 处理pageLeaveAutoTrack
1349
- if (pageLeaveAutoTrack === true) {
1350
- this.options.autoTrackConfig.pageLeaveAutoTrack = {
1351
- heartbeat_interval_time: 5000,
1352
- max_duration: 432000
1353
- };
1354
- }
1355
- // 处理trackAttr
1356
- if (isArray(trackAttr)) {
1357
- trackAttr = trackAttr.filter(function (v) { return isString(v); });
1358
- if (!trackAttr.includes('hn-click'))
1359
- trackAttr.push('hn-click');
1360
- }
1361
- else {
1362
- trackAttr = ['hn-click'];
1363
- }
1364
- this.options.autoTrackConfig.trackAttr = trackAttr;
1365
- // 处理collectTags
1366
- if (isObject(collectTags)) {
1367
- if (collectTags.div === true) {
1368
- this.options.autoTrackConfig.collectTags.div = {
1369
- ignoreTags: ignoreTags,
1370
- maxLevel: 1
1371
- };
1372
- }
1373
- else if (isObject(collectTags.div)) {
1374
- var maxLevel = 1;
1375
- var oDiv = collectTags.div;
1376
- if (isNumber(oDiv.maxLevel) && [1, 2, 3].includes(oDiv.maxLevel)) {
1377
- maxLevel = oDiv.maxLevel;
1378
- }
1379
- this.options.autoTrackConfig.collectTags.div = {
1380
- ignoreTags: ignoreTags,
1381
- maxLevel: maxLevel
1382
- };
1383
- }
1384
- else {
1385
- this.options.autoTrackConfig.collectTags.div = false;
1386
- }
1387
- }
1388
- else {
1389
- this.options.autoTrackConfig.collectTags = {
1390
- div: false
1391
- };
1392
- }
1393
- this.updateTrackTags();
1394
- // 处理批量发送
1395
- if (batchSend === true || isObject(batchSend)) {
1396
- this.options.batchSend = __assign({ dataSendTimeout: 6000, sendInterval: 6000, storageLimit: 200 }, batchSend);
1397
- this.batchSender = new BatchSend(this);
1398
- }
1399
- // 处理pageviewAutoTrack
1400
- if (pageviewAutoTrack === 'auto') {
1401
- this.autoTrack();
1402
- }
1403
- };
1404
- /**
1405
- * 初始化广告参数
1406
- */
1407
- HinaTrack.prototype.initAdvProps = function () {
1408
- var advProps = {};
1409
- var presetProperties = this.options.presetProperties || {};
1410
- Object.keys(presetProperties).forEach(function (key) {
1411
- var value = presetProperties[key];
1412
- if (key.includes('latest_')) {
1413
- key = key.slice(7);
1414
- if (value) {
1415
- var url_domain = getCurrentDomain();
1416
- if (key !== 'utm' && url_domain === 'url解析失败') {
1417
- advProps["H_latest_".concat(key)] = 'url的domain解析失败';
1418
- }
1419
- else if (isReferralTraffic()) {
1420
- switch (key) {
1421
- case 'traffic_source_type':
1422
- advProps.H_latest_traffic_source_type =
1423
- SearchKeyword.getSourceFromReferrer();
1424
- break;
1425
- case 'search_keyword':
1426
- var searchKeyword = SearchKeyword.getKeywordFromReferrer();
1427
- if (searchKeyword) {
1428
- advProps.H_latest_search_keyword = searchKeyword;
1429
- }
1430
- break;
1431
- case 'referrer': // todo 这块似乎没有什么用
1432
- advProps.H_latest_referrer = '';
1433
- break;
1434
- }
1435
- }
1436
- }
1437
- }
1438
- });
1439
- this.store.state.props = advProps;
1440
- if (presetProperties.latest_utm) {
1441
- this.getUmtsParams('H_latest_');
1442
- }
1443
- this.getUmtsParams('H_');
1444
- this.store.setProps(this.store.state.props);
1445
- };
1446
- /**
1447
- * 处理广告参数
1448
- * @param prefix
1449
- */
1450
- HinaTrack.prototype.getUmtsParams = function (prefix) {
1451
- if (prefix === void 0) { prefix = ''; }
1452
- var allUtms = getUmtsParams(prefix);
1453
- if (this.store.state.props && this.store.state.props.H_latest_utm_source) {
1454
- this.store.state.props = __assign(__assign({}, this.store.state.props), allUtms);
1455
- }
1456
- return allUtms;
1457
- };
1458
- /**
1459
- * 初始化共享数据
1460
- */
1461
- HinaTrack.prototype.initState = function () {
1462
- this.store = new State(this.options);
1463
- this.store.init();
1464
- };
1465
- /**
1466
- * 更新采集的dom元素
1467
- */
1468
- HinaTrack.prototype.updateTrackTags = function () {
1469
- var collectTags = this.options.autoTrackConfig.collectTags;
1470
- var tags = __spreadArray([], __read(defaultTags), false);
1471
- Object.keys(collectTags || {}).forEach(function (key) {
1472
- var value = collectTags[key];
1473
- if ((value === true || isObject(value)) && !tags.includes(key)) {
1474
- tags.push(key);
1475
- }
1476
- });
1477
- this.trackTags = tags;
1478
- };
1479
- /**
1480
- * 应用插件
1481
- */
1482
- HinaTrack.prototype.initPlugins = function () {
1483
- var _this = this;
1484
- var _a = this.options.plugins, plugins = _a === void 0 ? [] : _a;
1485
- plugins = plugins || [];
1486
- var clickCrackPlugin = new ClickTrackPlugin(this.options, this);
1487
- var stayTrackPlugin = new StayTrackPlugin(this.options, this);
1488
- var pageLeavePlugin = new PageLeavePlugin(this.options, this);
1489
- var siteLinkerPlugin = new SiteLinkerPlugin(this.options, this);
1490
- var historyPlugin = new HistoryPlugin(this.options, this);
1491
- var hashPlugin = new HashPlugin(this.options, this);
1492
- this.plugins = [
1493
- clickCrackPlugin,
1494
- stayTrackPlugin,
1495
- pageLeavePlugin,
1496
- siteLinkerPlugin,
1497
- historyPlugin,
1498
- hashPlugin
1499
- ];
1500
- plugins.forEach(function (Plugin) {
1501
- var instance = new Plugin(_this.options, _this);
1502
- _this.plugins.push(instance);
1503
- });
1504
- this.runPlugins(this.plugins);
1505
- };
1506
- /**
1507
- * @deprecated
1508
- * 启动内置插件,v4版本后不建议使用该方法启动插件
1509
- * 建议通过配置项的方式启动内置插件
1510
- */
1511
- HinaTrack.prototype.use = function (pluginName, options) {
1512
- var _this = this;
1513
- var _a = this.options, autoTrackConfig = _a.autoTrackConfig, siteLinkerConfig = _a.siteLinkerConfig;
1514
- var pageLeaveAutoTrack = autoTrackConfig.pageLeaveAutoTrack;
1515
- var startPlugin = function (pluginName) {
1516
- var pluginInstance = _this.plugins.find(function (plugin) { return plugin.name === pluginName; });
1517
- if (pluginInstance)
1518
- pluginInstance.init();
1519
- };
1520
- if (!isObject(options)) {
1521
- this.log("".concat(pluginName, "\u63D2\u4EF6\u914D\u7F6E\u9879\u5FC5\u987B\u662F\u4E00\u4E2A\u5BF9\u8C61\u7C7B\u578B"), ConsoleTypes.WARN);
1522
- return;
1523
- }
1524
- if (pluginName === 'PageLeave') {
1525
- if (isObject(pageLeaveAutoTrack)) {
1526
- this.log('PageLeave插件已通过pageLeaveAutoTrack的配置参数启动,不可重复启动,如果想通过use方式启动,请删除配置项中的pageLeaveAutoTrack', ConsoleTypes.WARN);
1527
- }
1528
- else {
1529
- this.options.autoTrackConfig.pageLeaveAutoTrack =
1530
- options;
1531
- startPlugin(PageLeavePluginName);
1532
- }
1533
- }
1534
- else if (pluginName === 'SiteLinker') {
1535
- if (isObject(siteLinkerConfig)) {
1536
- this.log('SiteLinker插件已通过siteLinkerConfig的配置参数启动,不可重复启动,如果想通过use方式启动,请删除配置项中的siteLinkerConfig', ConsoleTypes.WARN);
1537
- }
1538
- else {
1539
- this.options.siteLinkerConfig = options;
1540
- startPlugin(SiteLinkerPluginName);
1541
- }
1542
- }
1543
- };
1544
- /**
1545
- * 设置配置选项
1546
- * @param options 配置对象
1547
- */
1548
- HinaTrack.prototype.setConfig = function (options) {
1549
- this.options = merge(this.options, options);
1550
- this.normalizeConfig();
1551
- };
1552
- /**
1553
- * 获取配置选项 参数为空时 返回整个配置对象
1554
- * @param key
1555
- */
1556
- HinaTrack.prototype.getConfig = function (key) {
1557
- if (!key) {
1558
- return this.options;
1559
- }
1560
- return this.options[key];
1561
- };
1562
- /**
1563
- * 上报数据
1564
- * @param data
1565
- * @param callback
1566
- * @param type
1567
- */
1568
- HinaTrack.prototype.report = function (data, callback, type) {
1569
- console.log('report', data);
1570
- var _a = this.options, batchSend = _a.batchSend, globalCallback = _a.globalCallback, serverUrl = _a.serverUrl, dataSendTimeout = _a.dataSendTimeout, sendType = _a.sendType, imgUseCrossOrigin = _a.imgUseCrossOrigin;
1571
- sendType = type || sendType;
1572
- // 批量发送
1573
- if (batchSend) {
1574
- this.batchSender.add(data);
1575
- }
1576
- else {
1577
- var dataStr_1 = data;
1578
- if (!isString(data)) {
1579
- dataStr_1 = JSON.stringify(data);
1580
- }
1581
- var base64Data = base64Encode(dataStr_1);
1582
- var params = {
1583
- data: "data=".concat(base64Data),
1584
- url: serverUrl,
1585
- timeout: dataSendTimeout,
1586
- imgUseCrossOrigin: imgUseCrossOrigin
1587
- };
1588
- var request = void 0;
1589
- if (sendType === ReportType.BEACON && navigator.sendBeacon) {
1590
- request = new BeaconRequest(params);
1591
- }
1592
- else if (sendType === ReportType.IMAGE && params.data.length < 2048) {
1593
- request = new ImageRequest(params);
1594
- }
1595
- else {
1596
- request = new AjaxRequest(params);
1597
- }
1598
- return request.run().then(function (res) {
1599
- if (isFunction(globalCallback)) {
1600
- globalCallback(serverUrl, dataStr_1, res.type, res.msg);
1601
- }
1602
- if (isFunction(callback)) {
1603
- callback(serverUrl, dataStr_1, res.type, res.msg);
1604
- }
1605
- return res;
1606
- });
1607
- }
1608
- };
1609
- /**
1610
- * 设置用户登录的唯一标识
1611
- * @param uid
1612
- * @param callback
1613
- */
1614
- HinaTrack.prototype.setUserUId = function (uid, callback) {
1615
- uid = uid !== null && uid !== void 0 ? uid : '';
1616
- if (isNumber(uid) || isString(uid)) {
1617
- uid = String(uid).trim();
1618
- if (!uid) {
1619
- this.log('setUserUId: uid is empty', ConsoleTypes.WARN);
1620
- }
1621
- var accountId = this.store.getAccountId();
1622
- if (accountId !== uid) {
1623
- this.store.setAccountId(uid);
1624
- var props = this.getReportData('track_signup', 'H_SignUp', {});
1625
- this.report(props, callback);
1626
- }
1627
- else {
1628
- this.log('setUserUId: uid is equal to account_id, , failed to execute setUserUId', ConsoleTypes.WARN);
1629
- }
1630
- }
1631
- else {
1632
- this.log('setUserUId: uid must be string or number', ConsoleTypes.WARN);
1633
- }
1634
- };
1635
- /**
1636
- * 设置设备ID
1637
- * @param uid
1638
- */
1639
- HinaTrack.prototype.setDeviceUId = function (uid) {
1640
- this.store.setDeviceId(uid);
1641
- };
1642
- /**
1643
- * 获取设备ID
1644
- */
1645
- HinaTrack.prototype.getDeviceUId = function () {
1646
- return this.store.getDeviceId();
1647
- };
1648
- /**
1649
- * 自定义埋点事件
1650
- * @param event
1651
- * @param properties
1652
- * @param callback
1653
- */
1654
- HinaTrack.prototype.track = function (event, properties, callback) {
1655
- callback = callback || (function () { });
1656
- if (isString(event)) {
1657
- properties = isObject(properties) ? properties : {};
1658
- var props = this.getReportData('track', event, properties);
1659
- this.report(props, callback);
1660
- }
1661
- else {
1662
- this.log('eventName must be a sting and properties must be an object', ConsoleTypes.WARN);
1663
- }
1664
- };
1665
- /**
1666
- * @param name
1667
- * @param data
1668
- * @param callback
1669
- */
1670
- HinaTrack.prototype.quick = function (name, data, callback) {
1671
- var params = {};
1672
- callback = callback || (function () { });
1673
- if (isObject(data)) {
1674
- params = data;
1675
- }
1676
- else if (isFunction(data)) {
1677
- callback = data;
1678
- }
1679
- this.autoTrack(params, callback);
1680
- };
1681
- /**
1682
- * 开启页面浏览采集
1683
- * @param data
1684
- * @param callback
1685
- */
1686
- HinaTrack.prototype.autoTrack = function (data, callback) {
1687
- if (data === void 0) { data = {}; }
1688
- if (callback === void 0) { callback = noop; }
1689
- var props = this.getReportData('track', 'H_pageview', data);
1690
- this.report(props, callback);
1691
- if (this.store.isSetFirstVisit) {
1692
- this.store.isSetFirstVisit = false;
1693
- var referrer = getReferrer();
1694
- this.userSetOnce({
1695
- H_first_visit_time: nowStamp(),
1696
- H_first_referrer: referrer,
1697
- H_first_host: referrer ? getHostname(referrer, '取值异常') : '',
1698
- H_first_browser_language: isString(navigator.language)
1699
- ? navigator.language.toLowerCase()
1700
- : '取值异常',
1701
- H_first_traffic_source_type: SearchKeyword.getSourceFromReferrer(),
1702
- H_first_search_keyword: SearchKeyword.getKeywordFromReferrer()
1703
- });
1704
- }
1705
- };
1706
- /**
1707
- * 添加用户属性
1708
- * 直接设置用户的属性,如果存在则覆盖。
1709
- * @param data
1710
- * @param callback
1711
- */
1712
- HinaTrack.prototype.userSet = function (data, callback) {
1713
- if (isObject(data) && !isEmptyObject(data)) {
1714
- var props = this.getReportData('user_set', '', data);
1715
- this.report(props, callback);
1716
- }
1717
- };
1718
- /**
1719
- * 添加用户属性
1720
- * 如果不存在则设置,存在就不设置
1721
- * @param data
1722
- * @param callback
1723
- */
1724
- HinaTrack.prototype.userSetOnce = function (data, callback) {
1725
- if (isObject(data) && !isEmptyObject(data)) {
1726
- var props = this.getReportData('user_setOnce', '', data);
1727
- this.report(props, callback);
1728
- }
1729
- };
1730
- /**
1731
- * 对当前用户的属性做递增或者递减
1732
- * @param data
1733
- * @param callback
1734
- */
1735
- HinaTrack.prototype.userAdd = function (data, callback) {
1736
- var _a;
1737
- var _this = this;
1738
- if (isString(data)) {
1739
- data = (_a = {},
1740
- _a[data] = 1,
1741
- _a);
1742
- }
1743
- var isValid = function (params) {
1744
- for (var key in params) {
1745
- if (!/-*\d+/.test(String(params[key]))) {
1746
- _this.log('userAdd: value is must be number', ConsoleTypes.WARN);
1747
- return false;
1748
- }
1749
- }
1750
- return true;
1751
- };
1752
- if (isObject(data) && !isEmptyObject(data) && isValid(data)) {
1753
- var props = this.getReportData('user_add', '', data);
1754
- this.report(props, callback);
1755
- }
1756
- };
1757
- /**
1758
- * 删除当前用户的一些属性
1759
- * @param data
1760
- * @param callback
1761
- */
1762
- HinaTrack.prototype.userUnset = function (data, callback) {
1763
- var _this = this;
1764
- var obj = {};
1765
- if (isString(data)) {
1766
- data = [data];
1767
- }
1768
- if (isArray(data)) {
1769
- data.forEach(function (value) {
1770
- if (isString(value)) {
1771
- obj[value] = true;
1772
- }
1773
- else {
1774
- _this.log("userUnset: value inside the array must be string and have already been filtered out:".concat(value), ConsoleTypes.WARN);
1775
- }
1776
- });
1777
- if (!isEmptyObject(obj)) {
1778
- var props = this.getReportData('user_unset', '', obj);
1779
- this.report(props, callback);
1780
- }
1781
- }
1782
- else {
1783
- this.log('userUnset: param must be an array or string', ConsoleTypes.WARN);
1784
- }
1785
- };
1786
- /**
1787
- * 删除当前用户及他的所有属性。
1788
- * @param callback
1789
- */
1790
- HinaTrack.prototype.userDelete = function (callback) {
1791
- var props = this.getReportData('user_delete', '', {});
1792
- this.report(props, callback);
1793
- this.store.setAccountId('');
1794
- };
1795
- /**
1796
- * 添加事件属性
1797
- * 当使用函数类型作为属性值、函数返回值只能是string、bool、number、date、array类型
1798
- * @param params
1799
- */
1800
- HinaTrack.prototype.registerCommonProperties = function (params) {
1801
- this.presetProps = merge(this.presetProps, params);
1802
- };
1803
- /**
1804
- * 获取预置属性
1805
- * 此方法可获取,页面地址,页面标题,前向地址,SDK 类型及版本,屏幕宽高,最近一次的相关属性
1806
- */
1807
- HinaTrack.prototype.getPresetProperties = function () {
1808
- return {
1809
- H_is_first_day: this.store.isFirstDay,
1810
- H_is_first_time: this.store.isFirstTime,
1811
- device_id: this.store.getDeviceId(),
1812
- anonymous_id: this.store.getAnonymousId(),
1813
- account_id: this.store.getAccountId(),
1814
- properties: __assign(__assign(__assign({}, this.presetProps), getPageProperties()), getBrowserInfo())
1815
- };
1816
- };
1817
- /**
1818
- * 清空预置属性
1819
- * @param payload
1820
- */
1821
- HinaTrack.prototype.clearPageRegister = function (payload) {
1822
- var _this = this;
1823
- if (payload === void 0) { payload = true; }
1824
- if (payload === true) {
1825
- this.presetProps = {};
1826
- }
1827
- else if (isArray(payload)) {
1828
- payload.forEach(function (key) {
1829
- if (key in _this.presetProps)
1830
- delete _this.presetProps[key];
1831
- });
1832
- }
1833
- };
1834
- /**
1835
- * 检查发送数据
1836
- * @param props
1837
- */
1838
- HinaTrack.prototype.checkReportProperties = function (props) {
1839
- var _this = this;
1840
- Object.keys(props).forEach(function (key) {
1841
- var value = props[key];
1842
- if (isString(value) && value.length > MAX_STRING_LENGTH) {
1843
- _this.log("\u5C5E\u6027--".concat(key, " \u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u88AB\u5220\u9664"), ConsoleTypes.WARN);
1844
- delete props[key];
1845
- }
1846
- else if (isObject(value)) {
1847
- _this.checkReportProperties(value);
1848
- }
1849
- else if (isFunction(value)) {
1850
- props[key] = value(props);
1851
- if (isObject(props[key])) {
1852
- _this.checkReportProperties(props[key]);
1853
- }
1854
- else if (isString(props[key]) &&
1855
- props[key].length > MAX_STRING_LENGTH) {
1856
- _this.log("\u5C5E\u6027--".concat(key, " \u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u88AB\u5220\u9664"), ConsoleTypes.WARN);
1857
- delete props[key];
1858
- }
1859
- }
1860
- });
1861
- };
1862
- /**
1863
- * 获取上报数据
1864
- * @param type
1865
- * @param event
1866
- * @param data
1867
- */
1868
- HinaTrack.prototype.getReportData = function (type, event, data) {
1869
- var anonymous_id = this.store.getAnonymousId();
1870
- var accountId = this.store.getAccountId();
1871
- var time = nowStamp();
1872
- var reportProperties = this.getReportProperties(type, event);
1873
- var properties = __assign(__assign({}, reportProperties), (data || {}));
1874
- this.checkReportProperties(properties);
1875
- var props = {
1876
- anonymous_id: anonymous_id,
1877
- type: type,
1878
- event: event,
1879
- time: time,
1880
- _track_id: Number(String(getRandom()).slice(2, 5) +
1881
- String(getRandom()).slice(2, 4) +
1882
- String(nowStamp()).slice(-4)),
1883
- properties: properties
1884
- };
1885
- if (accountId) {
1886
- props.account_id = accountId;
1887
- }
1888
- props.send_time = nowStamp();
1889
- return props;
1890
- };
1891
- /**
1892
- * 获取通用的上报数据
1893
- * @param type 上报类型
1894
- * @param event 事件名称
1895
- */
1896
- HinaTrack.prototype.getReportProperties = function (type, event) {
1897
- if (type === void 0) { type = ''; }
1898
- if (event === void 0) { event = ''; }
1899
- // 这里对预置属性进行merge是为了防止影响this.presetProps的自身结构,深拷贝的操作
1900
- var presetProps = merge(this.presetProps);
1901
- var properties = __assign(__assign({ device_id: this.store.getDeviceId() }, this.store.state.props), presetProps);
1902
- // user_set、user_setOnce、user_add、user_unset、user_delete
1903
- if (!type || type.slice(0, 4) !== 'user') {
1904
- properties = __assign(__assign(__assign({}, properties), getPageProperties()), getBrowserInfo());
1905
- }
1906
- if (type === 'track') {
1907
- properties.H_is_first_day = this.store.isFirstDay;
1908
- this.store.isFirstDay = false;
1909
- if (event === 'H_pageview') {
1910
- properties.H_is_first_time = this.store.isFirstTime;
1911
- this.store.isFirstTime = false;
1912
- }
1913
- }
1914
- return properties;
1915
- };
1916
- return HinaTrack;
1917
- }(BaseCore));
1918
-
1919
- function createInstance(options) {
1920
- return new HinaTrack(options, false);
1921
- }
1922
- var hinaSdk = createInstance({});
1923
-
1924
- export { HinaTrack, hinaSdk as default };
1925
- //# sourceMappingURL=index.esm.js.map