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.
package/build/clarity.js CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  var dom = /*#__PURE__*/Object.freeze({
4
4
  __proto__: null,
5
- get add () { return add; },
5
+ get add () { return add$1; },
6
6
  get get () { return get; },
7
- get getId () { return getId; },
7
+ get getId () { return getId$1; },
8
8
  get getNode () { return getNode; },
9
9
  get getValue () { return getValue; },
10
10
  get has () { return has$1; },
@@ -189,7 +189,7 @@ function stop$F() {
189
189
  startTime = 0;
190
190
  }
191
191
 
192
- var version$1 = "0.8.20";
192
+ var version$1 = "0.8.21";
193
193
 
194
194
  // tslint:disable: no-bitwise
195
195
  function hash (input, precision) {
@@ -1259,7 +1259,7 @@ function recompute$8(evt) {
1259
1259
  var value = element.value;
1260
1260
  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 */;
1261
1261
  state$a.push({ time: time(evt), event: 42 /* Event.Change */, data: { target: target(evt), type: element.type, value: value, checksum: checksum } });
1262
- schedule(encode$3.bind(this, 42 /* Event.Change */));
1262
+ schedule(encode$4.bind(this, 42 /* Event.Change */));
1263
1263
  }
1264
1264
  }
1265
1265
  function reset$m() {
@@ -1297,7 +1297,7 @@ function observe$b(root) {
1297
1297
  function handler$3(event, root, evt) {
1298
1298
  handler$3.dn = 6 /* FunctionNames.ClickHandler */;
1299
1299
  var frame = iframe(root);
1300
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1300
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1301
1301
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1302
1302
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1303
1303
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1343,7 +1343,7 @@ function handler$3(event, root, evt) {
1343
1343
  isFullText: textInfo.isFullText,
1344
1344
  }
1345
1345
  });
1346
- schedule(encode$3.bind(this, event));
1346
+ schedule(encode$4.bind(this, event));
1347
1347
  }
1348
1348
  }
1349
1349
  function link(node) {
@@ -1434,7 +1434,7 @@ function observe$a(root) {
1434
1434
  function recompute$7(action, evt) {
1435
1435
  recompute$7.dn = 7 /* FunctionNames.ClipboardRecompute */;
1436
1436
  state$8.push({ time: time(evt), event: 38 /* Event.Clipboard */, data: { target: target(evt), action: action } });
1437
- schedule(encode$3.bind(this, 38 /* Event.Clipboard */));
1437
+ schedule(encode$4.bind(this, 38 /* Event.Clipboard */));
1438
1438
  }
1439
1439
  function reset$k() {
1440
1440
  state$8 = [];
@@ -1475,7 +1475,7 @@ function recompute$6(evt) {
1475
1475
  }
1476
1476
  }
1477
1477
  function process$7(event) {
1478
- schedule(encode$3.bind(this, event));
1478
+ schedule(encode$4.bind(this, event));
1479
1479
  }
1480
1480
  function reset$j() {
1481
1481
  state$7 = [];
@@ -1507,7 +1507,7 @@ function observe$8(root) {
1507
1507
  function mouse(event, root, evt) {
1508
1508
  mouse.dn = 10 /* FunctionNames.PointerMouse */;
1509
1509
  var frame = iframe(root);
1510
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1510
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1511
1511
  var x = "pageX" in evt ? Math.round(evt.pageX) : ("clientX" in evt ? Math.round(evt["clientX"] + d.scrollLeft) : null);
1512
1512
  var y = "pageY" in evt ? Math.round(evt.pageY) : ("clientY" in evt ? Math.round(evt["clientY"] + d.scrollTop) : null);
1513
1513
  // In case of iframe, we adjust (x,y) to be relative to top parent's origin
@@ -1524,7 +1524,7 @@ function mouse(event, root, evt) {
1524
1524
  function touch(event, root, evt) {
1525
1525
  touch.dn = 11 /* FunctionNames.PointerTouch */;
1526
1526
  var frame = iframe(root);
1527
- var d = frame ? frame.contentDocument.documentElement : document.documentElement;
1527
+ var d = frame && frame.contentDocument ? frame.contentDocument.documentElement : document.documentElement;
1528
1528
  var touches = evt.changedTouches;
1529
1529
  var t = time(evt);
1530
1530
  if (touches) {
@@ -1586,7 +1586,7 @@ function handler$2(current) {
1586
1586
  }
1587
1587
  }
1588
1588
  function process$6(event) {
1589
- schedule(encode$3.bind(this, event));
1589
+ schedule(encode$4.bind(this, event));
1590
1590
  }
1591
1591
  function reset$i() {
1592
1592
  state$6 = [];
@@ -1630,12 +1630,12 @@ function recompute$5() {
1630
1630
  timeout$4 = setTimeout$1(process$5, 500 /* Setting.LookAhead */, 11 /* Event.Resize */);
1631
1631
  }
1632
1632
  else {
1633
- encode$3(11 /* Event.Resize */);
1633
+ encode$4(11 /* Event.Resize */);
1634
1634
  initialStateLogged = true;
1635
1635
  }
1636
1636
  }
1637
1637
  function process$5(event) {
1638
- schedule(encode$3.bind(this, event));
1638
+ schedule(encode$4.bind(this, event));
1639
1639
  }
1640
1640
  function reset$h() {
1641
1641
  data$c = null;
@@ -1776,7 +1776,7 @@ function reset$g() {
1776
1776
  initialBottom = null;
1777
1777
  }
1778
1778
  function process$4(event) {
1779
- schedule(encode$3.bind(this, event));
1779
+ schedule(encode$4.bind(this, event));
1780
1780
  }
1781
1781
  function similar(last, current) {
1782
1782
  var dx = last.data.x - current.data.x;
@@ -1845,7 +1845,7 @@ function recompute$3(root) {
1845
1845
  timeout$2 = setTimeout$1(process$3, 500 /* Setting.LookAhead */, 21 /* Event.Selection */);
1846
1846
  }
1847
1847
  function process$3(event) {
1848
- schedule(encode$3.bind(this, event));
1848
+ schedule(encode$4.bind(this, event));
1849
1849
  }
1850
1850
  function reset$f() {
1851
1851
  previous = null;
@@ -1866,7 +1866,7 @@ function observe$5(root) {
1866
1866
  function recompute$2(evt) {
1867
1867
  recompute$2.dn = 16 /* FunctionNames.SubmitRecompute */;
1868
1868
  state$4.push({ time: time(evt), event: 39 /* Event.Submit */, data: { target: target(evt) } });
1869
- schedule(encode$3.bind(this, 39 /* Event.Submit */));
1869
+ schedule(encode$4.bind(this, 39 /* Event.Submit */));
1870
1870
  }
1871
1871
  function reset$e() {
1872
1872
  state$4 = [];
@@ -1882,7 +1882,7 @@ function start$q() {
1882
1882
  function recompute$1(evt) {
1883
1883
  recompute$1.dn = 17 /* FunctionNames.UnloadRecompute */;
1884
1884
  data$a = { name: evt.type, persisted: evt.persisted ? 1 /* BooleanFlag.True */ : 0 /* BooleanFlag.False */ };
1885
- encode$3(26 /* Event.Unload */, time(evt));
1885
+ encode$4(26 /* Event.Unload */, time(evt));
1886
1886
  stop();
1887
1887
  }
1888
1888
  function reset$d() {
@@ -1901,7 +1901,7 @@ function recompute(evt) {
1901
1901
  if (evt === void 0) { evt = null; }
1902
1902
  recompute.dn = 18 /* FunctionNames.VisibilityRecompute */;
1903
1903
  data$9 = { visible: "visibilityState" in document ? document.visibilityState : "default" };
1904
- encode$3(28 /* Event.Visibility */, time(evt));
1904
+ encode$4(28 /* Event.Visibility */, time(evt));
1905
1905
  }
1906
1906
  function reset$c() {
1907
1907
  data$9 = null;
@@ -2080,13 +2080,13 @@ function checkDocumentStyles(documentNode, timestamp) {
2080
2080
  }
2081
2081
  currentStyleSheets.push(styleSheet[styleSheetId]);
2082
2082
  }
2083
- var documentId = getId(documentNode, true);
2083
+ var documentId = getId$1(documentNode, true);
2084
2084
  if (!styleSheetMap[documentId]) {
2085
2085
  styleSheetMap[documentId] = [];
2086
2086
  }
2087
2087
  if (!arraysEqual(currentStyleSheets, styleSheetMap[documentId])) {
2088
2088
  // Using -1 to signify the root document node as we don't track that as part of our nodeMap
2089
- trackStyleAdoption(timestamp, documentNode == document ? -1 : getId(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2089
+ trackStyleAdoption(timestamp, documentNode == document ? -1 : getId$1(documentNode), 3 /* StyleSheetOperation.SetAdoptedStyles */, currentStyleSheets);
2090
2090
  styleSheetMap[documentId] = currentStyleSheets;
2091
2091
  styleTimeMap[documentId] = timestamp;
2092
2092
  }
@@ -2094,7 +2094,7 @@ function checkDocumentStyles(documentNode, timestamp) {
2094
2094
  function compute$7() {
2095
2095
  for (var _i = 0, documentNodes_1 = documentNodes; _i < documentNodes_1.length; _i++) {
2096
2096
  var documentNode = documentNodes_1[_i];
2097
- var docId = documentNode == document ? -1 : getId(documentNode);
2097
+ var docId = documentNode == document ? -1 : getId$1(documentNode);
2098
2098
  var ts = docId in styleTimeMap ? styleTimeMap[docId] : null;
2099
2099
  checkDocumentStyles(documentNode, ts);
2100
2100
  }
@@ -2120,7 +2120,7 @@ function trackStyleChange(time, id, operation, cssRules) {
2120
2120
  cssRules: cssRules
2121
2121
  }
2122
2122
  });
2123
- encode$4(46 /* Event.StyleSheetUpdate */);
2123
+ encode$5(46 /* Event.StyleSheetUpdate */);
2124
2124
  }
2125
2125
  function trackStyleAdoption(time, id, operation, newIds) {
2126
2126
  sheetAdoptionState.push({
@@ -2132,7 +2132,7 @@ function trackStyleAdoption(time, id, operation, newIds) {
2132
2132
  newIds: newIds
2133
2133
  }
2134
2134
  });
2135
- encode$4(45 /* Event.StyleSheetAdoption */);
2135
+ encode$5(45 /* Event.StyleSheetAdoption */);
2136
2136
  }
2137
2137
  function arraysEqual(a, b) {
2138
2138
  if (a.length !== b.length) {
@@ -2204,7 +2204,7 @@ function track$6(time, id, operation, keyFrames, timing, targetId, timeline) {
2204
2204
  timeline: timeline
2205
2205
  }
2206
2206
  });
2207
- encode$4(44 /* Event.Animation */);
2207
+ encode$5(44 /* Event.Animation */);
2208
2208
  }
2209
2209
  function stop$k() {
2210
2210
  reset$a();
@@ -2221,7 +2221,7 @@ function overrideAnimationHelper(functionToOverride, name) {
2221
2221
  function trackAnimationOperation(animation, name) {
2222
2222
  if (active()) {
2223
2223
  var effect = animation.effect;
2224
- var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId(effect.target) : null;
2224
+ var target = (effect === null || effect === void 0 ? void 0 : effect.target) ? getId$1(effect.target) : null;
2225
2225
  if (target !== null && effect.getKeyframes && effect.getTiming) {
2226
2226
  if (!animation[animationId]) {
2227
2227
  animation[animationId] = shortid();
@@ -2257,7 +2257,7 @@ function trackAnimationOperation(animation, name) {
2257
2257
  }
2258
2258
  }
2259
2259
 
2260
- function encode$4 (type, timer, ts) {
2260
+ function encode$5 (type, timer, ts) {
2261
2261
  if (timer === void 0) { timer = null; }
2262
2262
  if (ts === void 0) { ts = null; }
2263
2263
  return __awaiter(this, void 0, void 0, function () {
@@ -2382,7 +2382,7 @@ function encode$4 (type, timer, ts) {
2382
2382
  case "attributes":
2383
2383
  for (attr in data[key]) {
2384
2384
  if (data[key][attr] !== undefined) {
2385
- tokens.push(attribute(attr, data[key][attr], privacy));
2385
+ tokens.push(attribute$1(attr, data[key][attr], privacy));
2386
2386
  }
2387
2387
  }
2388
2388
  break;
@@ -2425,7 +2425,7 @@ function size(value) {
2425
2425
  function str(input) {
2426
2426
  return input.toString(36);
2427
2427
  }
2428
- function attribute(key, value, privacy) {
2428
+ function attribute$1(key, value, privacy) {
2429
2429
  return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
2430
2430
  }
2431
2431
 
@@ -2458,14 +2458,14 @@ function compute$6() {
2458
2458
  // Check that width or height has changed from before, and also that width & height are not null values
2459
2459
  if ((data$8 === null || width !== data$8.width || height !== data$8.height) && width !== null && height !== null) {
2460
2460
  data$8 = { width: width, height: height };
2461
- encode$4(8 /* Event.Document */);
2461
+ encode$5(8 /* Event.Document */);
2462
2462
  }
2463
2463
  }
2464
2464
  function stop$j() {
2465
2465
  reset$9();
2466
2466
  }
2467
2467
 
2468
- function traverse (root, timer, source, timestamp) {
2468
+ function traverse$1 (root, timer, source, timestamp) {
2469
2469
  return __awaiter(this, void 0, void 0, function () {
2470
2470
  var queue, entry, next, state$1, subnode;
2471
2471
  return __generator(this, function (_a) {
@@ -2658,7 +2658,7 @@ function process$2() {
2658
2658
  case 4:
2659
2659
  _i++;
2660
2660
  return [3 /*break*/, 2];
2661
- case 5: return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, record.time)];
2661
+ case 5: return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, record.time)];
2662
2662
  case 6:
2663
2663
  _d.sent();
2664
2664
  return [3 /*break*/, 1];
@@ -2684,7 +2684,7 @@ function process$2() {
2684
2684
  processThrottledMutations();
2685
2685
  }
2686
2686
  if (!(Object.keys(throttledMutations).length === 0 && processedMutations)) return [3 /*break*/, 13];
2687
- return [4 /*yield*/, encode$4(6 /* Event.Mutation */, timer, time())];
2687
+ return [4 /*yield*/, encode$5(6 /* Event.Mutation */, timer, time())];
2688
2688
  case 12:
2689
2689
  _d.sent();
2690
2690
  _d.label = 13;
@@ -2771,7 +2771,7 @@ function processNodeList(list, source, timer, timestamp) {
2771
2771
  if (!(i < length)) return [3 /*break*/, 6];
2772
2772
  node = list[i];
2773
2773
  if (!(source === 1 /* Source.ChildListAdd */)) return [3 /*break*/, 2];
2774
- traverse(node, timer, source, timestamp);
2774
+ traverse$1(node, timer, source, timestamp);
2775
2775
  return [3 /*break*/, 5];
2776
2776
  case 2:
2777
2777
  state$1 = state(timer);
@@ -3057,7 +3057,7 @@ function processNode (node, source, timestamp) {
3057
3057
  case Node.ELEMENT_NODE:
3058
3058
  var element = node;
3059
3059
  var tag = element.tagName;
3060
- var attributes = getAttributes(element);
3060
+ var attributes = getAttributes$1(element);
3061
3061
  // In some cases, external libraries like vue-fragment, can modify parentNode property to not be in sync with the DOM
3062
3062
  // For correctness, we first look at parentElement and if it not present then fall back to using parentNode
3063
3063
  parent = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
@@ -3237,7 +3237,7 @@ function getCssRules(sheet) {
3237
3237
  }
3238
3238
  return value;
3239
3239
  }
3240
- function getAttributes(element) {
3240
+ function getAttributes$1(element) {
3241
3241
  var output = {};
3242
3242
  var attributes = element.attributes;
3243
3243
  if (attributes && attributes.length > 0) {
@@ -3349,9 +3349,9 @@ var selector = /*#__PURE__*/Object.freeze({
3349
3349
  reset: reset$8
3350
3350
  });
3351
3351
 
3352
- var index = 1;
3352
+ var index$1 = 1;
3353
3353
  var nodesMap = null; // Maps id => node to retrieve further node details using id.
3354
- var values = [];
3354
+ var values$1 = [];
3355
3355
  var updateMap = [];
3356
3356
  var hashMap = {};
3357
3357
  var override = [];
@@ -3361,7 +3361,7 @@ var maskExclude = [];
3361
3361
  var maskDisable = [];
3362
3362
  var maskTags = [];
3363
3363
  // The WeakMap object is a collection of key/value pairs in which the keys are weakly referenced
3364
- var idMap = null; // Maps node => id.
3364
+ var idMap$1 = null; // Maps node => id.
3365
3365
  var iframeMap = null; // Maps iframe's contentDocument => parent iframe element
3366
3366
  var iframeContentMap = null; // Maps parent iframe element => iframe's contentDocument & contentWindow
3367
3367
  var privacyMap = null; // Maps node => Privacy (enum)
@@ -3374,8 +3374,8 @@ function stop$h() {
3374
3374
  reset$7();
3375
3375
  }
3376
3376
  function reset$7() {
3377
- index = 1;
3378
- values = [];
3377
+ index$1 = 1;
3378
+ values$1 = [];
3379
3379
  updateMap = [];
3380
3380
  hashMap = {};
3381
3381
  override = [];
@@ -3385,7 +3385,7 @@ function reset$7() {
3385
3385
  maskDisable = "radio,checkbox,range,button,reset,submit" /* Mask.Disable */.split("," /* Constant.Comma */);
3386
3386
  maskTags = "INPUT,SELECT,TEXTAREA" /* Mask.Tags */.split("," /* Constant.Comma */);
3387
3387
  nodesMap = new Map();
3388
- idMap = new WeakMap();
3388
+ idMap$1 = new WeakMap();
3389
3389
  iframeMap = new WeakMap();
3390
3390
  iframeContentMap = new WeakMap();
3391
3391
  privacyMap = new WeakMap();
@@ -3416,32 +3416,32 @@ function parse(root, init) {
3416
3416
  log$1(5 /* Code.Selector */, 1 /* Severity.Warning */, e ? e.name : null);
3417
3417
  }
3418
3418
  }
3419
- function getId(node, autogen) {
3419
+ function getId$1(node, autogen) {
3420
3420
  if (autogen === void 0) { autogen = false; }
3421
3421
  if (node === null) {
3422
3422
  return null;
3423
3423
  }
3424
- var id = idMap.get(node);
3424
+ var id = idMap$1.get(node);
3425
3425
  if (!id && autogen) {
3426
- id = index++;
3427
- idMap.set(node, id);
3426
+ id = index$1++;
3427
+ idMap$1.set(node, id);
3428
3428
  }
3429
3429
  return id ? id : null;
3430
3430
  }
3431
- function add(node, parent, data, source) {
3432
- var parentId = parent ? getId(parent) : null;
3431
+ function add$1(node, parent, data, source) {
3432
+ var parentId = parent ? getId$1(parent) : null;
3433
3433
  // Do not add detached nodes
3434
3434
  if ((!parent || !parentId) && node.host == null && node.nodeType !== Node.DOCUMENT_TYPE_NODE) {
3435
3435
  return;
3436
3436
  }
3437
- var id = getId(node, true);
3437
+ var id = getId$1(node, true);
3438
3438
  var previousId = getPreviousId(node);
3439
3439
  var parentValue = null;
3440
3440
  var regionId = exists(node) ? id : null;
3441
3441
  var fraudId = fraudMap.has(node) ? fraudMap.get(node) : null;
3442
3442
  var privacyId = config$2.content ? 1 /* Privacy.Sensitive */ : 3 /* Privacy.TextImage */;
3443
- if (parentId >= 0 && values[parentId]) {
3444
- parentValue = values[parentId];
3443
+ if (parentId >= 0 && values$1[parentId]) {
3444
+ parentValue = values$1[parentId];
3445
3445
  parentValue.children.push(id);
3446
3446
  regionId = regionId === null ? parentValue.region : regionId;
3447
3447
  fraudId = fraudId === null ? parentValue.metadata.fraud : fraudId;
@@ -3453,7 +3453,7 @@ function add(node, parent, data, source) {
3453
3453
  regionId = id;
3454
3454
  }
3455
3455
  nodesMap.set(id, node);
3456
- values[id] = {
3456
+ values$1[id] = {
3457
3457
  id: id,
3458
3458
  parent: parentId,
3459
3459
  previous: previousId,
@@ -3464,19 +3464,19 @@ function add(node, parent, data, source) {
3464
3464
  region: regionId,
3465
3465
  metadata: { active: true, suspend: false, privacy: privacyId, position: null, fraud: fraudId, size: null },
3466
3466
  };
3467
- privacy(node, values[id], parentValue);
3468
- updateSelector(values[id]);
3469
- updateImageSize(values[id]);
3467
+ privacy(node, values$1[id], parentValue);
3468
+ updateSelector(values$1[id]);
3469
+ updateImageSize(values$1[id]);
3470
3470
  track$4(id, source);
3471
3471
  }
3472
3472
  function update(node, parent, data, source) {
3473
- var id = getId(node);
3474
- var parentId = parent ? getId(parent) : null;
3473
+ var id = getId$1(node);
3474
+ var parentId = parent ? getId$1(parent) : null;
3475
3475
  var previousId = getPreviousId(node);
3476
3476
  var changed = false;
3477
3477
  var parentChanged = false;
3478
- if (id in values) {
3479
- var value = values[id];
3478
+ if (id in values$1) {
3479
+ var value = values$1[id];
3480
3480
  value.metadata.active = true;
3481
3481
  // Handle case where internal ordering may have changed
3482
3482
  if (value.previous !== previousId) {
@@ -3490,10 +3490,10 @@ function update(node, parent, data, source) {
3490
3490
  value.parent = parentId;
3491
3491
  // Move this node to the right location under new parent
3492
3492
  if (parentId !== null && parentId >= 0) {
3493
- var childIndex = previousId === null ? 0 : values[parentId].children.indexOf(previousId) + 1;
3494
- values[parentId].children.splice(childIndex, 0, id);
3493
+ var childIndex = previousId === null ? 0 : values$1[parentId].children.indexOf(previousId) + 1;
3494
+ values$1[parentId].children.splice(childIndex, 0, id);
3495
3495
  // Update region after the move
3496
- value.region = exists(node) ? id : values[parentId].region;
3496
+ value.region = exists(node) ? id : values$1[parentId].region;
3497
3497
  }
3498
3498
  else {
3499
3499
  // Mark this element as deleted if the parent has been updated to null
@@ -3501,9 +3501,9 @@ function update(node, parent, data, source) {
3501
3501
  }
3502
3502
  // Remove reference to this node from the old parent
3503
3503
  if (oldParentId !== null && oldParentId >= 0) {
3504
- var nodeIndex = values[oldParentId].children.indexOf(id);
3504
+ var nodeIndex = values$1[oldParentId].children.indexOf(id);
3505
3505
  if (nodeIndex >= 0) {
3506
- values[oldParentId].children.splice(nodeIndex, 1);
3506
+ values$1[oldParentId].children.splice(nodeIndex, 1);
3507
3507
  }
3508
3508
  }
3509
3509
  parentChanged = true;
@@ -3633,7 +3633,7 @@ function position(parent, child) {
3633
3633
  child.metadata.position = 1;
3634
3634
  var idx = parent ? parent.children.indexOf(child.id) : -1;
3635
3635
  while (idx-- > 0) {
3636
- var sibling = values[parent.children[idx]];
3636
+ var sibling = values$1[parent.children[idx]];
3637
3637
  if (child.data.tag === sibling.data.tag) {
3638
3638
  child.metadata.position = sibling.metadata.position + 1;
3639
3639
  break;
@@ -3642,7 +3642,7 @@ function position(parent, child) {
3642
3642
  return child.metadata.position;
3643
3643
  }
3644
3644
  function updateSelector(value) {
3645
- var parent = value.parent && value.parent in values ? values[value.parent] : null;
3645
+ var parent = value.parent && value.parent in values$1 ? values$1[value.parent] : null;
3646
3646
  var prefix = parent ? parent.selector : null;
3647
3647
  var d = value.data;
3648
3648
  var p = position(parent, value);
@@ -3660,35 +3660,35 @@ function getNode(id) {
3660
3660
  return nodesMap.has(id) ? nodesMap.get(id) : null;
3661
3661
  }
3662
3662
  function getValue(id) {
3663
- if (id in values) {
3664
- return values[id];
3663
+ if (id in values$1) {
3664
+ return values$1[id];
3665
3665
  }
3666
3666
  return null;
3667
3667
  }
3668
3668
  function get(node) {
3669
- var id = getId(node);
3670
- return id in values ? values[id] : null;
3669
+ var id = getId$1(node);
3670
+ return id in values$1 ? values$1[id] : null;
3671
3671
  }
3672
3672
  function lookup(hash) {
3673
3673
  return hash in hashMap ? hashMap[hash] : null;
3674
3674
  }
3675
3675
  function has$1(node) {
3676
- return nodesMap.has(getId(node));
3676
+ return nodesMap.has(getId$1(node));
3677
3677
  }
3678
3678
  function updates$2() {
3679
3679
  var output = [];
3680
3680
  for (var _i = 0, updateMap_1 = updateMap; _i < updateMap_1.length; _i++) {
3681
3681
  var id = updateMap_1[_i];
3682
- if (id in values) {
3683
- output.push(values[id]);
3682
+ if (id in values$1) {
3683
+ output.push(values$1[id]);
3684
3684
  }
3685
3685
  }
3686
3686
  updateMap = [];
3687
3687
  return output;
3688
3688
  }
3689
3689
  function remove(id, source) {
3690
- if (id in values) {
3691
- var value = values[id];
3690
+ if (id in values$1) {
3691
+ var value = values$1[id];
3692
3692
  value.metadata.active = false;
3693
3693
  value.parent = null;
3694
3694
  track$4(id, source);
@@ -3708,7 +3708,7 @@ function removeNodeFromNodesMap(id) {
3708
3708
  removeObserver(iframe_1);
3709
3709
  }
3710
3710
  nodesMap.delete(id);
3711
- var value = id in values ? values[id] : null;
3711
+ var value = id in values$1 ? values$1[id] : null;
3712
3712
  if (value && value.children) {
3713
3713
  for (var _i = 0, _a = value.children; _i < _a.length; _i++) {
3714
3714
  var childId = _a[_i];
@@ -3735,7 +3735,7 @@ function getPreviousId(node) {
3735
3735
  // Some nodes may not have an ID by design since Clarity skips over tags like SCRIPT, NOSCRIPT, META, COMMENTS, etc..
3736
3736
  // 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.
3737
3737
  while (id === null && node.previousSibling) {
3738
- id = getId(node.previousSibling);
3738
+ id = getId$1(node.previousSibling);
3739
3739
  node = node.previousSibling;
3740
3740
  }
3741
3741
  return id;
@@ -3818,7 +3818,7 @@ function compute$5() {
3818
3818
  var q = [];
3819
3819
  for (var _i = 0, queue_1 = queue$1; _i < queue_1.length; _i++) {
3820
3820
  var r = queue_1[_i];
3821
- var id = getId(r.node);
3821
+ var id = getId$1(r.node);
3822
3822
  if (id) {
3823
3823
  r.state.data.id = id;
3824
3824
  regions[id] = r.state.data;
@@ -3831,7 +3831,7 @@ function compute$5() {
3831
3831
  queue$1 = q;
3832
3832
  // Schedule encode only when we have at least one valid data entry
3833
3833
  if (state$2.length > 0) {
3834
- encode$4(7 /* Event.Region */);
3834
+ encode$5(7 /* Event.Region */);
3835
3835
  }
3836
3836
  }
3837
3837
  function handler$1(entries) {
@@ -3846,7 +3846,7 @@ function handler$1(entries) {
3846
3846
  // like search box - one for desktop, and another for mobile. In those cases, CSS media queries determine which one should be visible.
3847
3847
  // 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
3848
3848
  if (regionMap.has(target) && rect.width + rect.height > 0 && viewport && viewport.width > 0 && viewport.height > 0) {
3849
- var id = target ? getId(target) : null;
3849
+ var id = target ? getId$1(target) : null;
3850
3850
  var data = id in regions ? regions[id] : { id: id, name: regionMap.get(target), interaction: 16 /* InteractionState.None */, visibility: 0 /* RegionVisibility.Rendered */ };
3851
3851
  // For regions that have relatively smaller area, we look at intersection ratio and see the overlap relative to element's area
3852
3852
  // However, for larger regions, area of regions could be bigger than viewport and therefore comparison is relative to visible area
@@ -3867,7 +3867,7 @@ function handler$1(entries) {
3867
3867
  }
3868
3868
  }
3869
3869
  if (state$2.length > 0) {
3870
- encode$4(7 /* Event.Region */);
3870
+ encode$5(7 /* Event.Region */);
3871
3871
  }
3872
3872
  }
3873
3873
  function process$1(n, d, s, v) {
@@ -3934,7 +3934,7 @@ function metadata$2(node, event, text) {
3934
3934
  return output;
3935
3935
  }
3936
3936
 
3937
- function encode$3 (type, ts) {
3937
+ function encode$4 (type, ts) {
3938
3938
  if (ts === void 0) { ts = null; }
3939
3939
  return __awaiter(this, void 0, void 0, function () {
3940
3940
  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;
@@ -4173,13 +4173,146 @@ function compute$4() {
4173
4173
  }
4174
4174
  }
4175
4175
  state$1 = temp; // Drop events less than the min time
4176
- encode$3(22 /* Event.Timeline */);
4176
+ encode$4(22 /* Event.Timeline */);
4177
4177
  }
4178
4178
  function stop$f() {
4179
4179
  state$1 = [];
4180
4180
  reset$5();
4181
4181
  }
4182
4182
 
4183
+ function encode$3 (type) {
4184
+ return __awaiter(this, void 0, void 0, function () {
4185
+ var eventTime, tokens, d, values$1, _i, values_1, value, privacy, data, _a, _b, key, attr;
4186
+ return __generator(this, function (_c) {
4187
+ eventTime = time();
4188
+ tokens = [eventTime, type];
4189
+ switch (type) {
4190
+ case 8 /* Event.Document */:
4191
+ d = data$8;
4192
+ tokens.push(d.width);
4193
+ tokens.push(d.height);
4194
+ track$8(type, d.width, d.height);
4195
+ queue(tokens);
4196
+ break;
4197
+ case 43 /* Event.Snapshot */:
4198
+ values$1 = values;
4199
+ // Only encode and queue DOM updates if we have valid updates to report back
4200
+ if (values$1.length > 0) {
4201
+ for (_i = 0, values_1 = values$1; _i < values_1.length; _i++) {
4202
+ value = values_1[_i];
4203
+ privacy = value.metadata.privacy;
4204
+ data = value.data;
4205
+ for (_a = 0, _b = ["tag", "attributes", "value"]; _a < _b.length; _a++) {
4206
+ key = _b[_a];
4207
+ if (data[key]) {
4208
+ switch (key) {
4209
+ case "tag":
4210
+ tokens.push(value.id);
4211
+ if (value.parent) {
4212
+ tokens.push(value.parent);
4213
+ }
4214
+ if (value.previous) {
4215
+ tokens.push(value.previous);
4216
+ }
4217
+ tokens.push(data[key]);
4218
+ break;
4219
+ case "attributes":
4220
+ for (attr in data[key]) {
4221
+ if (data[key][attr] !== undefined) {
4222
+ tokens.push(attribute(attr, data[key][attr], privacy));
4223
+ }
4224
+ }
4225
+ break;
4226
+ case "value":
4227
+ tokens.push(text$1(data[key], data.tag, privacy));
4228
+ break;
4229
+ }
4230
+ }
4231
+ }
4232
+ }
4233
+ queue(tokenize(tokens), true);
4234
+ }
4235
+ break;
4236
+ }
4237
+ return [2 /*return*/];
4238
+ });
4239
+ });
4240
+ }
4241
+ function attribute(key, value, privacy) {
4242
+ return "".concat(key, "=").concat(text$1(value, key.indexOf("data-" /* Constant.DataAttribute */) === 0 ? "data-" /* Constant.DataAttribute */ : key, privacy));
4243
+ }
4244
+
4245
+ var values = [];
4246
+ var index = 1;
4247
+ var idMap = null; // Maps node => id.
4248
+ function snapshot() {
4249
+ values = [];
4250
+ traverse(document);
4251
+ encode$3(43 /* Event.Snapshot */);
4252
+ }
4253
+ function traverse(root) {
4254
+ var queue = [root];
4255
+ while (queue.length > 0) {
4256
+ var attributes = null, tag = null, value = null;
4257
+ var node = queue.shift();
4258
+ var next = node.firstChild;
4259
+ var parent_1 = node.parentElement ? node.parentElement : (node.parentNode ? node.parentNode : null);
4260
+ while (next) {
4261
+ queue.push(next);
4262
+ next = next.nextSibling;
4263
+ }
4264
+ // Process the node
4265
+ var type = node.nodeType;
4266
+ switch (type) {
4267
+ case Node.DOCUMENT_TYPE_NODE:
4268
+ var doctype = node;
4269
+ tag = "*D" /* Constant.DocumentTag */;
4270
+ attributes = { name: doctype.name, publicId: doctype.publicId, systemId: doctype.systemId };
4271
+ break;
4272
+ case Node.TEXT_NODE:
4273
+ value = node.nodeValue;
4274
+ tag = idMap.get(parent_1) ? "*T" /* Constant.TextTag */ : tag;
4275
+ break;
4276
+ case Node.ELEMENT_NODE:
4277
+ var element = node;
4278
+ attributes = getAttributes(element);
4279
+ tag = ["NOSCRIPT", "SCRIPT", "STYLE"].indexOf(element.tagName) < 0 ? element.tagName : tag;
4280
+ break;
4281
+ }
4282
+ add(node, parent_1, { tag: tag, attributes: attributes, value: value });
4283
+ }
4284
+ }
4285
+ /* Helper Functions - Snapshot Traversal */
4286
+ function getAttributes(element) {
4287
+ var output = {};
4288
+ var attributes = element.attributes;
4289
+ if (attributes && attributes.length > 0) {
4290
+ for (var i = 0; i < attributes.length; i++) {
4291
+ output[attributes[i].name] = attributes[i].value;
4292
+ }
4293
+ }
4294
+ return output;
4295
+ }
4296
+ function getId(node) {
4297
+ if (node === null) {
4298
+ return null;
4299
+ }
4300
+ if (idMap.has(node)) {
4301
+ return idMap.get(node);
4302
+ }
4303
+ idMap.set(node, index);
4304
+ return index++;
4305
+ }
4306
+ function add(node, parent, data) {
4307
+ if (node && data && data.tag) {
4308
+ var id = getId(node);
4309
+ var parentId = parent ? idMap.get(parent) : null;
4310
+ var previous = node.previousSibling ? idMap.get(node.previousSibling) : null;
4311
+ var metadata_1 = { active: true, suspend: false, privacy: 5 /* Privacy.Snapshot */, position: null, fraud: null, size: null };
4312
+ values.push({ id: id, parent: parentId, previous: previous, children: [], data: data, selector: null, hash: null, region: null, metadata: metadata_1 });
4313
+ }
4314
+ }
4315
+
4183
4316
  var discoverBytes = 0;
4184
4317
  var playbackBytes = 0;
4185
4318
  var playback;
@@ -4330,6 +4463,7 @@ function stringify(encoded) {
4330
4463
  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, "}");
4331
4464
  }
4332
4465
  function send(payload, zipped, sequence, beacon) {
4466
+ var _a;
4333
4467
  if (beacon === void 0) { beacon = false; }
4334
4468
  // Upload data if a valid URL is defined in the config
4335
4469
  if (typeof config$2.upload === "string" /* Constant.String */) {
@@ -4346,8 +4480,15 @@ function send(payload, zipped, sequence, beacon) {
4346
4480
  if (dispatched) {
4347
4481
  done(sequence);
4348
4482
  }
4483
+ else {
4484
+ // If sendBeacon fails, we report the error and continue with XHR upload
4485
+ report(new Error("".concat("BeaconError" /* Constant.BeaconError */, ": ").concat(payload.length)));
4486
+ }
4487
+ }
4488
+ catch (error) {
4489
+ // If sendBeacon fails, we report the error and continue with XHR upload
4490
+ 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)));
4349
4491
  }
4350
- catch ( /* do nothing - and we will automatically fallback to XHR below */_a) { /* do nothing - and we will automatically fallback to XHR below */ }
4351
4492
  }
4352
4493
  // Before initiating XHR upload, we check if the data has already been uploaded using sendBeacon
4353
4494
  // There are two cases when dispatched could still be false:
@@ -4407,6 +4548,9 @@ function check$3(xhr, sequence) {
4407
4548
  if (xhr.status === 0) {
4408
4549
  config$2.upload = config$2.fallback ? config$2.fallback : config$2.upload;
4409
4550
  }
4551
+ // Capture the status code and number of attempts so we can report it back to the server
4552
+ track$1 = { sequence: sequence, attempts: transitData.attempts, status: xhr.status };
4553
+ encode$1(2 /* Event.Upload */);
4410
4554
  // In all other cases, re-attempt sending the same data
4411
4555
  // For retry we always fallback to string payload, even though we may have attempted
4412
4556
  // sending zipped payload earlier
@@ -4482,6 +4626,10 @@ function response(payload) {
4482
4626
  signalsEvent(parts[1]);
4483
4627
  }
4484
4628
  break;
4629
+ case "SNAPSHOT" /* Constant.Snapshot */:
4630
+ config$2.lean = false; // Disable lean mode to ensure we can send playback information to server.
4631
+ snapshot();
4632
+ break;
4485
4633
  }
4486
4634
  }
4487
4635
  }
@@ -4798,11 +4946,11 @@ function discover() {
4798
4946
  ts = time();
4799
4947
  timer = { id: id(), cost: 3 /* Metric.LayoutCost */ };
4800
4948
  start$d(timer);
4801
- return [4 /*yield*/, traverse(document, timer, 0 /* Source.Discover */, ts)];
4949
+ return [4 /*yield*/, traverse$1(document, timer, 0 /* Source.Discover */, ts)];
4802
4950
  case 1:
4803
4951
  _a.sent();
4804
4952
  checkDocumentStyles(document, ts);
4805
- return [4 /*yield*/, encode$4(5 /* Event.Discover */, timer, ts)];
4953
+ return [4 /*yield*/, encode$5(5 /* Event.Discover */, timer, ts)];
4806
4954
  case 2:
4807
4955
  _a.sent();
4808
4956
  stop$c(timer);
@@ -5080,7 +5228,7 @@ function start$8() {
5080
5228
  var _a, _b, _c;
5081
5229
  rootDomain = null;
5082
5230
  var ua = navigator && "userAgent" in navigator ? navigator.userAgent : "" /* Constant.Empty */;
5083
- 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 : '';
5231
+ 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 : '';
5084
5232
  var timezoneOffset = new Date().getTimezoneOffset().toString();
5085
5233
  var ancestorOrigins = window.location.ancestorOrigins ? Array.from(window.location.ancestorOrigins).toString() : '';
5086
5234
  var title = document && document.title ? document.title : "" /* Constant.Empty */;
@@ -5922,7 +6070,7 @@ var observer;
5922
6070
  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 */];
5923
6071
  function start$2() {
5924
6072
  // Capture connection properties, if available
5925
- if (navigator && "connection" in navigator) {
6073
+ if (navigator && navigator["connection"]) {
5926
6074
  log(27 /* Dimension.ConnectionType */, navigator["connection"]["effectiveType"]);
5927
6075
  }
5928
6076
  // Check the browser support performance observer as a pre-requisite for any performance measurement