clarity-js 0.8.20 → 0.8.21

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.
@@ -1,8 +1,8 @@
1
1
  var dom = /*#__PURE__*/Object.freeze({
2
2
  __proto__: null,
3
- get add () { return add; },
3
+ get add () { return add$1; },
4
4
  get get () { return get; },
5
- get getId () { return getId; },
5
+ get getId () { return getId$1; },
6
6
  get getNode () { return getNode; },
7
7
  get getValue () { return getValue; },
8
8
  get has () { return has$1; },
@@ -187,7 +187,7 @@ function stop$F() {
187
187
  startTime = 0;
188
188
  }
189
189
 
190
- var version$1 = "0.8.20";
190
+ var version$1 = "0.8.21";
191
191
 
192
192
  // tslint:disable: no-bitwise
193
193
  function hash (input, precision) {
@@ -1257,7 +1257,7 @@ function recompute$8(evt) {
1257
1257
  var value = element.value;
1258
1258
  var checksum = value && value.length >= 5 /* Setting.WordLength */ && config$2.fraud && "password,secret,pass,social,ssn,code,hidden" /* Mask.Exclude */.indexOf(element.type) === -1 ? hash(value, 28 /* Setting.ChecksumPrecision */) : "" /* Constant.Empty */;
1259
1259
  state$a.push({ time: time(evt), event: 42 /* Event.Change */, data: { target: target(evt), type: element.type, value: value, checksum: checksum } });
1260
- schedule(encode$3.bind(this, 42 /* Event.Change */));
1260
+ schedule(encode$4.bind(this, 42 /* Event.Change */));
1261
1261
  }
1262
1262
  }
1263
1263
  function reset$m() {
@@ -1295,7 +1295,7 @@ function observe$b(root) {
1295
1295
  function handler$3(event, root, evt) {
1296
1296
  handler$3.dn = 6 /* FunctionNames.ClickHandler */;
1297
1297
  var frame = iframe(root);
1298
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1298
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1299
1299
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1300
1300
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1301
1301
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1341,7 +1341,7 @@ function handler$3(event, root, evt) {
1341
1341
  isFullText: textInfo.isFullText,
1342
1342
  }
1343
1343
  });
1344
- schedule(encode$3.bind(this, event));
1344
+ schedule(encode$4.bind(this, event));
1345
1345
  }
1346
1346
  }
1347
1347
  function link(node) {
@@ -1432,7 +1432,7 @@ function observe$a(root) {
1432
1432
  function recompute$7(action, evt) {
1433
1433
  recompute$7.dn = 7 /* FunctionNames.ClipboardRecompute */;
1434
1434
  state$8.push({ time: time(evt), event: 38 /* Event.Clipboard */, data: { target: target(evt), action: action } });
1435
- schedule(encode$3.bind(this, 38 /* Event.Clipboard */));
1435
+ schedule(encode$4.bind(this, 38 /* Event.Clipboard */));
1436
1436
  }
1437
1437
  function reset$k() {
1438
1438
  state$8 = [];
@@ -1473,7 +1473,7 @@ function recompute$6(evt) {
1473
1473
  }
1474
1474
  }
1475
1475
  function process$7(event) {
1476
- schedule(encode$3.bind(this, event));
1476
+ schedule(encode$4.bind(this, event));
1477
1477
  }
1478
1478
  function reset$j() {
1479
1479
  state$7 = [];
@@ -1505,7 +1505,7 @@ function observe$8(root) {
1505
1505
  function mouse(event, root, evt) {
1506
1506
  mouse.dn = 10 /* FunctionNames.PointerMouse */;
1507
1507
  var frame = iframe(root);
1508
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1508
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1509
1509
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1510
1510
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1511
1511
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1522,7 +1522,7 @@ function mouse(event, root, evt) {
1522
1522
  function touch(event, root, evt) {
1523
1523
  touch.dn = 11 /* FunctionNames.PointerTouch */;
1524
1524
  var frame = iframe(root);
1525
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1525
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1526
1526
  var touches = evt.changedTouches;
1527
1527
  var t = time(evt);
1528
1528
  if (touches) {
@@ -1584,7 +1584,7 @@ function handler$2(current) {
1584
1584
  }
1585
1585
  }
1586
1586
  function process$6(event) {
1587
- schedule(encode$3.bind(this, event));
1587
+ schedule(encode$4.bind(this, event));
1588
1588
  }
1589
1589
  function reset$i() {
1590
1590
  state$6 = [];
@@ -1628,12 +1628,12 @@ function recompute$5() {
1628
1628
  timeout$4 = setTimeout$1(process$5, 500 /* Setting.LookAhead */, 11 /* Event.Resize */);
1629
1629
  }
1630
1630
  else {
1631
- encode$3(11 /* Event.Resize */);
1631
+ encode$4(11 /* Event.Resize */);
1632
1632
  initialStateLogged = true;
1633
1633
  }
1634
1634
  }
1635
1635
  function process$5(event) {
1636
- schedule(encode$3.bind(this, event));
1636
+ schedule(encode$4.bind(this, event));
1637
1637
  }
1638
1638
  function reset$h() {
1639
1639
  data$c = null;
@@ -1774,7 +1774,7 @@ function reset$g() {
1774
1774
  initialBottom = null;
1775
1775
  }
1776
1776
  function process$4(event) {
1777
- schedule(encode$3.bind(this, event));
1777
+ schedule(encode$4.bind(this, event));
1778
1778
  }
1779
1779
  function similar(last, current) {
1780
1780
  var dx = last.data.x - current.data.x;
@@ -1843,7 +1843,7 @@ function recompute$3(root) {
1843
1843
  timeout$2 = setTimeout$1(process$3, 500 /* Setting.LookAhead */, 21 /* Event.Selection */);
1844
1844
  }
1845
1845
  function process$3(event) {
1846
- schedule(encode$3.bind(this, event));
1846
+ schedule(encode$4.bind(this, event));
1847
1847
  }
1848
1848
  function reset$f() {
1849
1849
  previous = null;
@@ -1864,7 +1864,7 @@ function observe$5(root) {
1864
1864
  function recompute$2(evt) {
1865
1865
  recompute$2.dn = 16 /* FunctionNames.SubmitRecompute */;
1866
1866
  state$4.push({ time: time(evt), event: 39 /* Event.Submit */, data: { target: target(evt) } });
1867
- schedule(encode$3.bind(this, 39 /* Event.Submit */));
1867
+ schedule(encode$4.bind(this, 39 /* Event.Submit */));
1868
1868
  }
1869
1869
  function reset$e() {
1870
1870
  state$4 = [];
@@ -1880,7 +1880,7 @@ function start$q() {
1880
1880
  function recompute$1(evt) {
1881
1881
  recompute$1.dn = 17 /* FunctionNames.UnloadRecompute */;
1882
1882
  data$a = { name: evt.type, persisted: evt.persisted ? 1 /* BooleanFlag.True */ : 0 /* BooleanFlag.False */ };
1883
- encode$3(26 /* Event.Unload */, time(evt));
1883
+ encode$4(26 /* Event.Unload */, time(evt));
1884
1884
  stop();
1885
1885
  }
1886
1886
  function reset$d() {
@@ -1899,7 +1899,7 @@ function recompute(evt) {
1899
1899
  if (evt === void 0) { evt = null; }
1900
1900
  recompute.dn = 18 /* FunctionNames.VisibilityRecompute */;
1901
1901
  data$9 = { visible: "visibilityState" in document ? document.visibilityState : "default" };
1902
- encode$3(28 /* Event.Visibility */, time(evt));
1902
+ encode$4(28 /* Event.Visibility */, time(evt));
1903
1903
  }
1904
1904
  function reset$c() {
1905
1905
  data$9 = null;
@@ -2078,13 +2078,13 @@ function checkDocumentStyles(documentNode, timestamp) {
2078
2078
  }
2079
2079
  currentStyleSheets.push(styleSheet[styleSheetId]);
2080
2080
  }
2081
- var documentId = getId(documentNode, true);
2081
+ var documentId = getId$1(documentNode, true);
2082
2082
  if (!styleSheetMap[documentId]) {
2083
2083
  styleSheetMap[documentId] = [];
2084
2084
  }
2085
2085
  if (!arraysEqual(currentStyleSheets, styleSheetMap[documentId])) {
2086
2086
  // Using -1 to signify the root document node as we don't track that as part of our nodeMap
2087
- trackStyleAdoption(timestamp, documentNode == document ? -1 : getId(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2087
+ trackStyleAdoption(timestamp, documentNode == document ? -1 : getId$1(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2088
2088
  styleSheetMap[documentId] = currentStyleSheets;
2089
2089
  styleTimeMap[documentId] = timestamp;
2090
2090
  }
@@ -2092,7 +2092,7 @@ function checkDocumentStyles(documentNode, timestamp) {
2092
2092
  function compute$7() {
2093
2093
  for (var _i = 0, documentNodes_1 = documentNodes; _i < documentNodes_1.length; _i++) {
2094
2094
  var documentNode = documentNodes_1[_i];
2095
- var docId = documentNode == document ? -1 : getId(documentNode);
2095
+ var docId = documentNode == document ? -1 : getId$1(documentNode);
2096
2096
  var ts = docId in styleTimeMap ? styleTimeMap[docId] : null;
2097
2097
  checkDocumentStyles(documentNode, ts);
2098
2098
  }
@@ -2118,7 +2118,7 @@ function trackStyleChange(time, id, operation, cssRules) {
2118
2118
  cssRules: cssRules
2119
2119
  }
2120
2120
  });
2121
- encode$4(46 /* Event.StyleSheetUpdate */);
2121
+ encode$5(46 /* Event.StyleSheetUpdate */);
2122
2122
  }
2123
2123
  function trackStyleAdoption(time, id, operation, newIds) {
2124
2124
  sheetAdoptionState.push({
@@ -2130,7 +2130,7 @@ function trackStyleAdoption(time, id, operation, newIds) {
2130
2130
  newIds: newIds
2131
2131
  }
2132
2132
  });
2133
- encode$4(45 /* Event.StyleSheetAdoption */);
2133
+ encode$5(45 /* Event.StyleSheetAdoption */);
2134
2134
  }
2135
2135
  function arraysEqual(a, b) {
2136
2136
  if (a.length !== b.length) {
@@ -2202,7 +2202,7 @@ function track$6(time, id, operation, keyFrames, timing, targetId, timeline) {
2202
2202
  timeline: timeline
2203
2203
  }
2204
2204
  });
2205
- encode$4(44 /* Event.Animation */);
2205
+ encode$5(44 /* Event.Animation */);
2206
2206
  }
2207
2207
  function stop$k() {
2208
2208
  reset$a();
@@ -2219,7 +2219,7 @@ function overrideAnimationHelper(functionToOverride, name) {
2219
2219
  function trackAnimationOperation(animation, name) {
2220
2220
  if (active()) {
2221
2221
  var effect = animation.effect;
2222
- var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId(effect.target) : null;
2222
+ var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId$1(effect.target) : null;
2223
2223
  if (target !== null && effect.getKeyframes && effect.getTiming) {
2224
2224
  if (!animation[animationId]) {
2225
2225
  animation[animationId] = shortid();
@@ -2255,7 +2255,7 @@ function trackAnimationOperation(animation, name) {
2255
2255
  }
2256
2256
  }
2257
2257
 
2258
- function encode$4 (type, timer, ts) {
2258
+ function encode$5 (type, timer, ts) {
2259
2259
  if (timer === void 0) { timer = null; }
2260
2260
  if (ts === void 0) { ts = null; }
2261
2261
  return __awaiter(this, void 0, void 0, function () {
@@ -2380,7 +2380,7 @@ function encode$4 (type, timer, ts) {
2380
2380
  case "attributes":
2381
2381
  for (attr in data[key]) {
2382
2382
  if (data[key][attr] !== undefined) {
2383
- tokens.push(attribute(attr, data[key][attr], privacy));
2383
+ tokens.push(attribute$1(attr, data[key][attr], privacy));
2384
2384
  }
2385
2385
  }
2386
2386
  break;
@@ -2423,7 +2423,7 @@ function size(value) {
2423
2423
  function str(input) {
2424
2424
  return input.toString(36);
2425
2425
  }
2426
- function attribute(key, value, privacy) {
2426
+ function attribute$1(key, value, privacy) {
2427
2427
  return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
2428
2428
  }
2429
2429
 
@@ -2456,14 +2456,14 @@ function compute$6() {
2456
2456
  // Check that width or height has changed from before, and also that width & height are not null values
2457
2457
  if ((data$8 === null || width !== data$8.width || height !== data$8.height) && width !== null && height !== null) {
2458
2458
  data$8 = { width: width, height: height };
2459
- encode$4(8 /* Event.Document */);
2459
+ encode$5(8 /* Event.Document */);
2460
2460
  }
2461
2461
  }
2462
2462
  function stop$j() {
2463
2463
  reset$9();
2464
2464
  }
2465
2465
 
2466
- function traverse (root, timer, source, timestamp) {
2466
+ function traverse$1 (root, timer, source, timestamp) {
2467
2467
  return __awaiter(this, void 0, void 0, function () {
2468
2468
  var queue, entry, next, state$1, subnode;
2469
2469
  return __generator(this, function (_a) {
@@ -2656,7 +2656,7 @@ function process$2() {
2656
2656
  case 4:
2657
2657
  _i++;
2658
2658
  return [3 /*break*/, 2];
2659
- case 5: return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, record.time)];
2659
+ case 5: return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, record.time)];
2660
2660
  case 6:
2661
2661
  _d.sent();
2662
2662
  return [3 /*break*/, 1];
@@ -2682,7 +2682,7 @@ function process$2() {
2682
2682
  processThrottledMutations();
2683
2683
  }
2684
2684
  if (!(Object.keys(throttledMutations).length === 0 && processedMutations)) return [3 /*break*/, 13];
2685
- return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, time())];
2685
+ return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, time())];
2686
2686
  case 12:
2687
2687
  _d.sent();
2688
2688
  _d.label = 13;
@@ -2769,7 +2769,7 @@ function processNodeList(list, source, timer, timestamp) {
2769
2769
  if (!(i < length)) return [3 /*break*/, 6];
2770
2770
  node = list[i];
2771
2771
  if (!(source === 1 /* Source.ChildListAdd */)) return [3 /*break*/, 2];
2772
- traverse(node, timer, source, timestamp);
2772
+ traverse$1(node, timer, source, timestamp);
2773
2773
  return [3 /*break*/, 5];
2774
2774
  case 2:
2775
2775
  state$1 = state(timer);
@@ -3055,7 +3055,7 @@ function processNode (node, source, timestamp) {
3055
3055
  case Node.ELEMENT_NODE:
3056
3056
  var element = node;
3057
3057
  var tag = element.tagName;
3058
- var attributes = getAttributes(element);
3058
+ var attributes = getAttributes$1(element);
3059
3059
  // In some cases, external libraries like vue-fragment, can modify parentNode property to not be in sync with the DOM
3060
3060
  // For correctness, we first look at parentElement and if it not present then fall back to using parentNode
3061
3061
  parent = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
@@ -3235,7 +3235,7 @@ function getCssRules(sheet) {
3235
3235
  }
3236
3236
  return value;
3237
3237
  }
3238
- function getAttributes(element) {
3238
+ function getAttributes$1(element) {
3239
3239
  var output = {};
3240
3240
  var attributes = element.attributes;
3241
3241
  if (attributes && attributes.length > 0) {
@@ -3347,9 +3347,9 @@ var selector = /*#__PURE__*/Object.freeze({
3347
3347
  reset: reset$8
3348
3348
  });
3349
3349
 
3350
- var index = 1;
3350
+ var index$1 = 1;
3351
3351
  var nodesMap = null; // Maps id => node to retrieve further node details using id.
3352
- var values = [];
3352
+ var values$1 = [];
3353
3353
  var updateMap = [];
3354
3354
  var hashMap = {};
3355
3355
  var override = [];
@@ -3359,7 +3359,7 @@ var maskExclude = [];
3359
3359
  var maskDisable = [];
3360
3360
  var maskTags = [];
3361
3361
  // The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced
3362
- var idMap = null; // Maps node => id.
3362
+ var idMap$1 = null; // Maps node => id.
3363
3363
  var iframeMap = null; // Maps iframe's contentDocument => parent iframe element
3364
3364
  var iframeContentMap = null; // Maps parent iframe element => iframe's contentDocument & contentWindow
3365
3365
  var privacyMap = null; // Maps node => Privacy (enum)
@@ -3372,8 +3372,8 @@ function stop$h() {
3372
3372
  reset$7();
3373
3373
  }
3374
3374
  function reset$7() {
3375
- index = 1;
3376
- values = [];
3375
+ index$1 = 1;
3376
+ values$1 = [];
3377
3377
  updateMap = [];
3378
3378
  hashMap = {};
3379
3379
  override = [];
@@ -3383,7 +3383,7 @@ function reset$7() {
3383
3383
  maskDisable = "radio,checkbox,range,button,reset,submit" /* Mask.Disable */.split("," /* Constant.Comma */);
3384
3384
  maskTags = "INPUT,SELECT,TEXTAREA" /* Mask.Tags */.split("," /* Constant.Comma */);
3385
3385
  nodesMap = new Map();
3386
- idMap = new WeakMap();
3386
+ idMap$1 = new WeakMap();
3387
3387
  iframeMap = new WeakMap();
3388
3388
  iframeContentMap = new WeakMap();
3389
3389
  privacyMap = new WeakMap();
@@ -3414,32 +3414,32 @@ function parse(root, init) {
3414
3414
  log$1(5 /* Code.Selector */, 1 /* Severity.Warning */, e ? e.name : null);
3415
3415
  }
3416
3416
  }
3417
- function getId(node, autogen) {
3417
+ function getId$1(node, autogen) {
3418
3418
  if (autogen === void 0) { autogen = false; }
3419
3419
  if (node === null) {
3420
3420
  return null;
3421
3421
  }
3422
- var id = idMap.get(node);
3422
+ var id = idMap$1.get(node);
3423
3423
  if (!id && autogen) {
3424
- id = index++;
3425
- idMap.set(node, id);
3424
+ id = index$1++;
3425
+ idMap$1.set(node, id);
3426
3426
  }
3427
3427
  return id ? id : null;
3428
3428
  }
3429
- function add(node, parent, data, source) {
3430
- var parentId = parent ? getId(parent) : null;
3429
+ function add$1(node, parent, data, source) {
3430
+ var parentId = parent ? getId$1(parent) : null;
3431
3431
  // Do not add detached nodes
3432
3432
  if ((!parent || !parentId) && node.host == null && node.nodeType !== Node.DOCUMENT_TYPE_NODE) {
3433
3433
  return;
3434
3434
  }
3435
- var id = getId(node, true);
3435
+ var id = getId$1(node, true);
3436
3436
  var previousId = getPreviousId(node);
3437
3437
  var parentValue = null;
3438
3438
  var regionId = exists(node) ? id : null;
3439
3439
  var fraudId = fraudMap.has(node) ? fraudMap.get(node) : null;
3440
3440
  var privacyId = config$2.content ? 1 /* Privacy.Sensitive */ : 3 /* Privacy.TextImage */;
3441
- if (parentId >= 0 && values[parentId]) {
3442
- parentValue = values[parentId];
3441
+ if (parentId >= 0 && values$1[parentId]) {
3442
+ parentValue = values$1[parentId];
3443
3443
  parentValue.children.push(id);
3444
3444
  regionId = regionId === null ? parentValue.region : regionId;
3445
3445
  fraudId = fraudId === null ? parentValue.metadata.fraud : fraudId;
@@ -3451,7 +3451,7 @@ function add(node, parent, data, source) {
3451
3451
  regionId = id;
3452
3452
  }
3453
3453
  nodesMap.set(id, node);
3454
- values[id] = {
3454
+ values$1[id] = {
3455
3455
  id: id,
3456
3456
  parent: parentId,
3457
3457
  previous: previousId,
@@ -3462,19 +3462,19 @@ function add(node, parent, data, source) {
3462
3462
  region: regionId,
3463
3463
  metadata: { active: true, suspend: false, privacy: privacyId, position: null, fraud: fraudId, size: null },
3464
3464
  };
3465
- privacy(node, values[id], parentValue);
3466
- updateSelector(values[id]);
3467
- updateImageSize(values[id]);
3465
+ privacy(node, values$1[id], parentValue);
3466
+ updateSelector(values$1[id]);
3467
+ updateImageSize(values$1[id]);
3468
3468
  track$4(id, source);
3469
3469
  }
3470
3470
  function update(node, parent, data, source) {
3471
- var id = getId(node);
3472
- var parentId = parent ? getId(parent) : null;
3471
+ var id = getId$1(node);
3472
+ var parentId = parent ? getId$1(parent) : null;
3473
3473
  var previousId = getPreviousId(node);
3474
3474
  var changed = false;
3475
3475
  var parentChanged = false;
3476
- if (id in values) {
3477
- var value = values[id];
3476
+ if (id in values$1) {
3477
+ var value = values$1[id];
3478
3478
  value.metadata.active = true;
3479
3479
  // Handle case where internal ordering may have changed
3480
3480
  if (value.previous !== previousId) {
@@ -3488,10 +3488,10 @@ function update(node, parent, data, source) {
3488
3488
  value.parent = parentId;
3489
3489
  // Move this node to the right location under new parent
3490
3490
  if (parentId !== null && parentId >= 0) {
3491
- var childIndex = previousId === null ? 0 : values[parentId].children.indexOf(previousId) + 1;
3492
- values[parentId].children.splice(childIndex, 0, id);
3491
+ var childIndex = previousId === null ? 0 : values$1[parentId].children.indexOf(previousId) + 1;
3492
+ values$1[parentId].children.splice(childIndex, 0, id);
3493
3493
  // Update region after the move
3494
- value.region = exists(node) ? id : values[parentId].region;
3494
+ value.region = exists(node) ? id : values$1[parentId].region;
3495
3495
  }
3496
3496
  else {
3497
3497
  // Mark this element as deleted if the parent has been updated to null
@@ -3499,9 +3499,9 @@ function update(node, parent, data, source) {
3499
3499
  }
3500
3500
  // Remove reference to this node from the old parent
3501
3501
  if (oldParentId !== null && oldParentId >= 0) {
3502
- var nodeIndex = values[oldParentId].children.indexOf(id);
3502
+ var nodeIndex = values$1[oldParentId].children.indexOf(id);
3503
3503
  if (nodeIndex >= 0) {
3504
- values[oldParentId].children.splice(nodeIndex, 1);
3504
+ values$1[oldParentId].children.splice(nodeIndex, 1);
3505
3505
  }
3506
3506
  }
3507
3507
  parentChanged = true;
@@ -3631,7 +3631,7 @@ function position(parent, child) {
3631
3631
  child.metadata.position = 1;
3632
3632
  var idx = parent ? parent.children.indexOf(child.id) : -1;
3633
3633
  while (idx-- > 0) {
3634
- var sibling = values[parent.children[idx]];
3634
+ var sibling = values$1[parent.children[idx]];
3635
3635
  if (child.data.tag === sibling.data.tag) {
3636
3636
  child.metadata.position = sibling.metadata.position + 1;
3637
3637
  break;
@@ -3640,7 +3640,7 @@ function position(parent, child) {
3640
3640
  return child.metadata.position;
3641
3641
  }
3642
3642
  function updateSelector(value) {
3643
- var parent = value.parent && value.parent in values ? values[value.parent] : null;
3643
+ var parent = value.parent && value.parent in values$1 ? values$1[value.parent] : null;
3644
3644
  var prefix = parent ? parent.selector : null;
3645
3645
  var d = value.data;
3646
3646
  var p = position(parent, value);
@@ -3658,35 +3658,35 @@ function getNode(id) {
3658
3658
  return nodesMap.has(id) ? nodesMap.get(id) : null;
3659
3659
  }
3660
3660
  function getValue(id) {
3661
- if (id in values) {
3662
- return values[id];
3661
+ if (id in values$1) {
3662
+ return values$1[id];
3663
3663
  }
3664
3664
  return null;
3665
3665
  }
3666
3666
  function get(node) {
3667
- var id = getId(node);
3668
- return id in values ? values[id] : null;
3667
+ var id = getId$1(node);
3668
+ return id in values$1 ? values$1[id] : null;
3669
3669
  }
3670
3670
  function lookup(hash) {
3671
3671
  return hash in hashMap ? hashMap[hash] : null;
3672
3672
  }
3673
3673
  function has$1(node) {
3674
- return nodesMap.has(getId(node));
3674
+ return nodesMap.has(getId$1(node));
3675
3675
  }
3676
3676
  function updates$2() {
3677
3677
  var output = [];
3678
3678
  for (var _i = 0, updateMap_1 = updateMap; _i < updateMap_1.length; _i++) {
3679
3679
  var id = updateMap_1[_i];
3680
- if (id in values) {
3681
- output.push(values[id]);
3680
+ if (id in values$1) {
3681
+ output.push(values$1[id]);
3682
3682
  }
3683
3683
  }
3684
3684
  updateMap = [];
3685
3685
  return output;
3686
3686
  }
3687
3687
  function remove(id, source) {
3688
- if (id in values) {
3689
- var value = values[id];
3688
+ if (id in values$1) {
3689
+ var value = values$1[id];
3690
3690
  value.metadata.active = false;
3691
3691
  value.parent = null;
3692
3692
  track$4(id, source);
@@ -3706,7 +3706,7 @@ function removeNodeFromNodesMap(id) {
3706
3706
  removeObserver(iframe_1);
3707
3707
  }
3708
3708
  nodesMap.delete(id);
3709
- var value = id in values ? values[id] : null;
3709
+ var value = id in values$1 ? values$1[id] : null;
3710
3710
  if (value && value.children) {
3711
3711
  for (var _i = 0, _a = value.children; _i < _a.length; _i++) {
3712
3712
  var childId = _a[_i];
@@ -3733,7 +3733,7 @@ function getPreviousId(node) {
3733
3733
  // Some nodes may not have an ID by design since Clarity skips over tags like SCRIPT, NOSCRIPT, META, COMMENTS, etc..
3734
3734
  // In that case, we keep going back and check for their sibling until we find a sibling with ID or no more sibling nodes are left.
3735
3735
  while (id === null && node.previousSibling) {
3736
- id = getId(node.previousSibling);
3736
+ id = getId$1(node.previousSibling);
3737
3737
  node = node.previousSibling;
3738
3738
  }
3739
3739
  return id;
@@ -3816,7 +3816,7 @@ function compute$5() {
3816
3816
  var q = [];
3817
3817
  for (var _i = 0, queue_1 = queue$1; _i < queue_1.length; _i++) {
3818
3818
  var r = queue_1[_i];
3819
- var id = getId(r.node);
3819
+ var id = getId$1(r.node);
3820
3820
  if (id) {
3821
3821
  r.state.data.id = id;
3822
3822
  regions[id] = r.state.data;
@@ -3829,7 +3829,7 @@ function compute$5() {
3829
3829
  queue$1 = q;
3830
3830
  // Schedule encode only when we have at least one valid data entry
3831
3831
  if (state$2.length > 0) {
3832
- encode$4(7 /* Event.Region */);
3832
+ encode$5(7 /* Event.Region */);
3833
3833
  }
3834
3834
  }
3835
3835
  function handler$1(entries) {
@@ -3844,7 +3844,7 @@ function handler$1(entries) {
3844
3844
  // like search box - one for desktop, and another for mobile. In those cases, CSS media queries determine which one should be visible.
3845
3845
  // Also, if these regions ever become non-zero width or height (through AJAX, user action or orientation change) - we will automatically start monitoring them from that point onwards
3846
3846
  if (regionMap.has(target) && rect.width + rect.height > 0 && viewport && viewport.width > 0 && viewport.height > 0) {
3847
- var id = target ? getId(target) : null;
3847
+ var id = target ? getId$1(target) : null;
3848
3848
  var data = id in regions ? regions[id] : { id: id, name: regionMap.get(target), interaction: 16 /* InteractionState.None */, visibility: 0 /* RegionVisibility.Rendered */ };
3849
3849
  // For regions that have relatively smaller area, we look at intersection ratio and see the overlap relative to element's area
3850
3850
  // However, for larger regions, area of regions could be bigger than viewport and therefore comparison is relative to visible area
@@ -3865,7 +3865,7 @@ function handler$1(entries) {
3865
3865
  }
3866
3866
  }
3867
3867
  if (state$2.length > 0) {
3868
- encode$4(7 /* Event.Region */);
3868
+ encode$5(7 /* Event.Region */);
3869
3869
  }
3870
3870
  }
3871
3871
  function process$1(n, d, s, v) {
@@ -3932,7 +3932,7 @@ function metadata$2(node, event, text) {
3932
3932
  return output;
3933
3933
  }
3934
3934
 
3935
- function encode$3 (type, ts) {
3935
+ function encode$4 (type, ts) {
3936
3936
  if (ts === void 0) { ts = null; }
3937
3937
  return __awaiter(this, void 0, void 0, function () {
3938
3938
  var t, tokens, _i, _a, entry, pTarget, _b, _c, entry, cTarget, cHash, _d, _e, entry, target, r, u, _f, _g, entry, iTarget, s, startTarget, endTarget, _h, _j, entry, sTarget, top_1, bottom, sTopHash, sBottomHash, _k, _l, entry, target, _m, _o, entry, target, _p, _q, entry, v;
@@ -4171,13 +4171,146 @@ function compute$4() {
4171
4171
  }
4172
4172
  }
4173
4173
  state$1 = temp; // Drop events less than the min time
4174
- encode$3(22 /* Event.Timeline */);
4174
+ encode$4(22 /* Event.Timeline */);
4175
4175
  }
4176
4176
  function stop$f() {
4177
4177
  state$1 = [];
4178
4178
  reset$5();
4179
4179
  }
4180
4180
 
4181
+ function encode$3 (type) {
4182
+ return __awaiter(this, void 0, void 0, function () {
4183
+ var eventTime, tokens, d, values$1, _i, values_1, value, privacy, data, _a, _b, key, attr;
4184
+ return __generator(this, function (_c) {
4185
+ eventTime = time();
4186
+ tokens = [eventTime, type];
4187
+ switch (type) {
4188
+ case 8 /* Event.Document */:
4189
+ d = data$8;
4190
+ tokens.push(d.width);
4191
+ tokens.push(d.height);
4192
+ track$8(type, d.width, d.height);
4193
+ queue(tokens);
4194
+ break;
4195
+ case 43 /* Event.Snapshot */:
4196
+ values$1 = values;
4197
+ // Only encode and queue DOM updates if we have valid updates to report back
4198
+ if (values$1.length > 0) {
4199
+ for (_i = 0, values_1 = values$1; _i < values_1.length; _i++) {
4200
+ value = values_1[_i];
4201
+ privacy = value.metadata.privacy;
4202
+ data = value.data;
4203
+ for (_a = 0, _b = ["tag", "attributes", "value"]; _a < _b.length; _a++) {
4204
+ key = _b[_a];
4205
+ if (data[key]) {
4206
+ switch (key) {
4207
+ case "tag":
4208
+ tokens.push(value.id);
4209
+ if (value.parent) {
4210
+ tokens.push(value.parent);
4211
+ }
4212
+ if (value.previous) {
4213
+ tokens.push(value.previous);
4214
+ }
4215
+ tokens.push(data[key]);
4216
+ break;
4217
+ case "attributes":
4218
+ for (attr in data[key]) {
4219
+ if (data[key][attr] !== undefined) {
4220
+ tokens.push(attribute(attr, data[key][attr], privacy));
4221
+ }
4222
+ }
4223
+ break;
4224
+ case "value":
4225
+ tokens.push(text$1(data[key], data.tag, privacy));
4226
+ break;
4227
+ }
4228
+ }
4229
+ }
4230
+ }
4231
+ queue(tokenize(tokens), true);
4232
+ }
4233
+ break;
4234
+ }
4235
+ return [2 /*return*/];
4236
+ });
4237
+ });
4238
+ }
4239
+ function attribute(key, value, privacy) {
4240
+ return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
4241
+ }
4242
+
4243
+ var values = [];
4244
+ var index = 1;
4245
+ var idMap = null; // Maps node => id.
4246
+ function snapshot() {
4247
+ values = [];
4248
+ traverse(document);
4249
+ encode$3(43 /* Event.Snapshot */);
4250
+ }
4251
+ function traverse(root) {
4252
+ var queue = [root];
4253
+ while (queue.length > 0) {
4254
+ var attributes = null, tag = null, value = null;
4255
+ var node = queue.shift();
4256
+ var next = node.firstChild;
4257
+ var parent_1 = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
4258
+ while (next) {
4259
+ queue.push(next);
4260
+ next = next.nextSibling;
4261
+ }
4262
+ // Process the node
4263
+ var type = node.nodeType;
4264
+ switch (type) {
4265
+ case Node.DOCUMENT_TYPE_NODE:
4266
+ var doctype = node;
4267
+ tag = "*D" /* Constant.DocumentTag */;
4268
+ attributes = { name: doctype.name, publicId: doctype.publicId, systemId: doctype.systemId };
4269
+ break;
4270
+ case Node.TEXT_NODE:
4271
+ value = node.nodeValue;
4272
+ tag = idMap.get(parent_1) ? "*T" /* Constant.TextTag */ : tag;
4273
+ break;
4274
+ case Node.ELEMENT_NODE:
4275
+ var element = node;
4276
+ attributes = getAttributes(element);
4277
+ tag = ["NOSCRIPT", "SCRIPT", "STYLE"].indexOf(element.tagName) < 0 ? element.tagName : tag;
4278
+ break;
4279
+ }
4280
+ add(node, parent_1, { tag: tag, attributes: attributes, value: value });
4281
+ }
4282
+ }
4283
+ /* Helper Functions - Snapshot Traversal */
4284
+ function getAttributes(element) {
4285
+ var output = {};
4286
+ var attributes = element.attributes;
4287
+ if (attributes && attributes.length > 0) {
4288
+ for (var i = 0; i < attributes.length; i++) {
4289
+ output[attributes[i].name] = attributes[i].value;
4290
+ }
4291
+ }
4292
+ return output;
4293
+ }
4294
+ function getId(node) {
4295
+ if (node === null) {
4296
+ return null;
4297
+ }
4298
+ if (idMap.has(node)) {
4299
+ return idMap.get(node);
4300
+ }
4301
+ idMap.set(node, index);
4302
+ return index++;
4303
+ }
4304
+ function add(node, parent, data) {
4305
+ if (node && data && data.tag) {
4306
+ var id = getId(node);
4307
+ var parentId = parent ? idMap.get(parent) : null;
4308
+ var previous = node.previousSibling ? idMap.get(node.previousSibling) : null;
4309
+ var metadata_1 = { active: true, suspend: false, privacy: 5 /* Privacy.Snapshot */, position: null, fraud: null, size: null };
4310
+ values.push({ id: id, parent: parentId, previous: previous, children: [], data: data, selector: null, hash: null, region: null, metadata: metadata_1 });
4311
+ }
4312
+ }
4313
+
4181
4314
  var discoverBytes = 0;
4182
4315
  var playbackBytes = 0;
4183
4316
  var playback;
@@ -4328,6 +4461,7 @@ function stringify(encoded) {
4328
4461
  return encoded.p.length > 0 ? "{\"e\":".concat(encoded.e, ",\"a\":").concat(encoded.a, ",\"p\":").concat(encoded.p, "}") : "{\"e\":".concat(encoded.e, ",\"a\":").concat(encoded.a, "}");
4329
4462
  }
4330
4463
  function send(payload, zipped, sequence, beacon) {
4464
+ var _a;
4331
4465
  if (beacon === void 0) { beacon = false; }
4332
4466
  // Upload data if a valid URL is defined in the config
4333
4467
  if (typeof config$2.upload === "string" /* Constant.String */) {
@@ -4344,8 +4478,15 @@ function send(payload, zipped, sequence, beacon) {
4344
4478
  if (dispatched) {
4345
4479
  done(sequence);
4346
4480
  }
4481
+ else {
4482
+ // If sendBeacon fails, we report the error and continue with XHR upload
4483
+ report(new Error("".concat("BeaconError" /* Constant.BeaconError */, ": ").concat(payload.length)));
4484
+ }
4485
+ }
4486
+ catch (error) {
4487
+ // If sendBeacon fails, we report the error and continue with XHR upload
4488
+ report(new Error("".concat("BeaconError" /* Constant.BeaconError */, ": ").concat((_a = error === null || error === void 0 ? void 0 : error.message) === null || _a === void 0 ? void 0 : _a.substring(0, 50), " : ").concat(payload.length)));
4347
4489
  }
4348
- catch ( /* do nothing - and we will automatically fallback to XHR below */_a) { /* do nothing - and we will automatically fallback to XHR below */ }
4349
4490
  }
4350
4491
  // Before initiating XHR upload, we check if the data has already been uploaded using sendBeacon
4351
4492
  // There are two cases when dispatched could still be false:
@@ -4405,6 +4546,9 @@ function check$3(xhr, sequence) {
4405
4546
  if (xhr.status === 0) {
4406
4547
  config$2.upload = config$2.fallback ? config$2.fallback : config$2.upload;
4407
4548
  }
4549
+ // Capture the status code and number of attempts so we can report it back to the server
4550
+ track$1 = { sequence: sequence, attempts: transitData.attempts, status: xhr.status };
4551
+ encode$1(2 /* Event.Upload */);
4408
4552
  // In all other cases, re-attempt sending the same data
4409
4553
  // For retry we always fallback to string payload, even though we may have attempted
4410
4554
  // sending zipped payload earlier
@@ -4480,6 +4624,10 @@ function response(payload) {
4480
4624
  signalsEvent(parts[1]);
4481
4625
  }
4482
4626
  break;
4627
+ case "SNAPSHOT" /* Constant.Snapshot */:
4628
+ config$2.lean = false; // Disable lean mode to ensure we can send playback information to server.
4629
+ snapshot();
4630
+ break;
4483
4631
  }
4484
4632
  }
4485
4633
  }
@@ -4796,11 +4944,11 @@ function discover() {
4796
4944
  ts = time();
4797
4945
  timer = { id: id(), cost: 3 /* Metric.LayoutCost */ };
4798
4946
  start$d(timer);
4799
- return [4 /*yield*/, traverse(document, timer, 0 /* Source.Discover */, ts)];
4947
+ return [4 /*yield*/, traverse$1(document, timer, 0 /* Source.Discover */, ts)];
4800
4948
  case 1:
4801
4949
  _a.sent();
4802
4950
  checkDocumentStyles(document, ts);
4803
- return [4 /*yield*/, encode$4(5 /* Event.Discover */, timer, ts)];
4951
+ return [4 /*yield*/, encode$5(5 /* Event.Discover */, timer, ts)];
4804
4952
  case 2:
4805
4953
  _a.sent();
4806
4954
  stop$c(timer);
@@ -5078,7 +5226,7 @@ function start$8() {
5078
5226
  var _a, _b, _c;
5079
5227
  rootDomain = null;
5080
5228
  var ua = navigator && "userAgent" in navigator ? navigator.userAgent : "" /* Constant.Empty */;
5081
- var timezone = (_c = (_b = (_a = Intl === null || Intl === void 0 ? void 0 : Intl.DateTimeFormat()) === null || _a === void 0 ? void 0 : _a.resolvedOptions()) === null || _b === void 0 ? void 0 : _b.timeZone) !== null && _c !== void 0 ? _c : '';
5229
+ var timezone = (_c = (typeof Intl !== 'undefined' && ((_b = (_a = Intl === null || Intl === void 0 ? void 0 : Intl.DateTimeFormat()) === null || _a === void 0 ? void 0 : _a.resolvedOptions()) === null || _b === void 0 ? void 0 : _b.timeZone))) !== null && _c !== void 0 ? _c : '';
5082
5230
  var timezoneOffset = new Date().getTimezoneOffset().toString();
5083
5231
  var ancestorOrigins = window.location.ancestorOrigins ? Array.from(window.location.ancestorOrigins).toString() : '';
5084
5232
  var title = document && document.title ? document.title : "" /* Constant.Empty */;
@@ -5920,7 +6068,7 @@ var observer;
5920
6068
  var types = ["navigation" /* Constant.Navigation */, "resource" /* Constant.Resource */, "longtask" /* Constant.LongTask */, "first-input" /* Constant.FID */, "layout-shift" /* Constant.CLS */, "largest-contentful-paint" /* Constant.LCP */, "event" /* Constant.PerformanceEventTiming */];
5921
6069
  function start$2() {
5922
6070
  // Capture connection properties, if available
5923
- if (navigator && "connection" in navigator) {
6071
+ if (navigator && navigator["connection"]) {
5924
6072
  log(27 /* Dimension.ConnectionType */, navigator["connection"]["effectiveType"]);
5925
6073
  }
5926
6074
  // Check the browser support performance observer as a pre-requisite for any performance measurement