@sailfish-ai/recorder 1.12.4 → 1.12.5

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 (33) hide show
  1. package/dist/chunks/{chunkSerializer-FQtY90Av.js → chunkSerializer-Cd8y9tID.js} +1 -1
  2. package/dist/chunks/chunkSerializer-Cd8y9tID.js.br +0 -0
  3. package/dist/chunks/chunkSerializer-Cd8y9tID.js.gz +0 -0
  4. package/dist/chunks/{chunkSerializer-DDukZpgl.js → chunkSerializer-pkpgT-FH.js} +1 -1
  5. package/dist/chunks/chunkSerializer-pkpgT-FH.js.br +0 -0
  6. package/dist/chunks/chunkSerializer-pkpgT-FH.js.gz +0 -0
  7. package/dist/chunks/{index-C-qbsfKe.js → index-Bvd8oTpV.js} +63 -55
  8. package/dist/chunks/index-Bvd8oTpV.js.br +0 -0
  9. package/dist/chunks/index-Bvd8oTpV.js.gz +0 -0
  10. package/dist/chunks/{index-D6axlCRu.js → index-CXvHbLRT.js} +24 -16
  11. package/dist/chunks/index-CXvHbLRT.js.br +0 -0
  12. package/dist/chunks/index-CXvHbLRT.js.gz +0 -0
  13. package/dist/inAppReportIssueModal/index.js +48 -0
  14. package/dist/inAppReportIssueModal/index.js.br +0 -0
  15. package/dist/inAppReportIssueModal/index.js.gz +0 -0
  16. package/dist/recorder.cjs +1 -1
  17. package/dist/recorder.cjs.br +0 -0
  18. package/dist/recorder.cjs.gz +0 -0
  19. package/dist/recorder.js +1 -1
  20. package/dist/recorder.js.br +0 -0
  21. package/dist/recorder.js.gz +0 -0
  22. package/dist/recorder.umd.cjs +9 -1
  23. package/dist/recorder.umd.cjs.br +0 -0
  24. package/dist/recorder.umd.cjs.gz +0 -0
  25. package/package.json +1 -1
  26. package/dist/chunks/chunkSerializer-DDukZpgl.js.br +0 -0
  27. package/dist/chunks/chunkSerializer-DDukZpgl.js.gz +0 -0
  28. package/dist/chunks/chunkSerializer-FQtY90Av.js.br +0 -0
  29. package/dist/chunks/chunkSerializer-FQtY90Av.js.gz +0 -0
  30. package/dist/chunks/index-C-qbsfKe.js.br +0 -0
  31. package/dist/chunks/index-C-qbsfKe.js.gz +0 -0
  32. package/dist/chunks/index-D6axlCRu.js.br +0 -0
  33. package/dist/chunks/index-D6axlCRu.js.gz +0 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const e = require("./index-C-qbsfKe.js");
3
+ const e = require("./index-Bvd8oTpV.js");
4
4
  exports.chunkedSnapshot = async function chunkedSnapshot(t, n, s = {}) {
5
5
  const o = s.chunkSize ?? 500, r = s.maxChunkMs ?? 16, { blockClass: a, blockSelector: c, maskTextClass: i, maskTextSelector: u, maskInputSelector: d, maskInputOptions: l, maskInputFn: f, maskTextFn: N, unmaskSelector: h } = s;
6
6
  function matchesSelectorSafe(e2, t2) {
@@ -1,4 +1,4 @@
1
- import { y as e } from "./index-D6axlCRu.js";
1
+ import { y as e } from "./index-CXvHbLRT.js";
2
2
  async function chunkedSnapshot(t, n, s = {}) {
3
3
  const o = s.chunkSize ?? 500, r = s.maxChunkMs ?? 16, { blockClass: a, blockSelector: c, maskTextClass: i, maskTextSelector: u, maskInputSelector: d, maskInputOptions: l, maskInputFn: f, maskTextFn: N, unmaskSelector: m } = s;
4
4
  function matchesSelectorSafe(e2, t2) {
@@ -202,24 +202,24 @@ async function deleteNotifyMessageById(e2) {
202
202
  });
203
203
  }
204
204
  const f = "undefined" != typeof globalThis && void 0 !== globalThis.window, g = "undefined" != typeof globalThis && void 0 !== globalThis.document, m = "undefined" != typeof globalThis && "localStorage" in globalThis, h = "undefined" != typeof globalThis && "sessionStorage" in globalThis, y = "sailfishSessionId", S = "__sailfish_refresh__";
205
- let b = null;
205
+ let v = null;
206
206
  function getOrSetSessionId() {
207
207
  if (!f) return uuidv4();
208
- if (b) return b;
208
+ if (v) return v;
209
209
  const e2 = window.name.startsWith(S);
210
210
  if (e2 && (window.name = window.name.substring(20)), e2) {
211
211
  const e3 = window.sessionStorage.getItem(y);
212
- if (e3) return b = e3, e3;
212
+ if (e3) return v = e3, e3;
213
213
  }
214
214
  const t2 = uuidv4();
215
- b = t2;
215
+ v = t2;
216
216
  try {
217
217
  window.sessionStorage.setItem(y, t2);
218
218
  } catch (e3) {
219
219
  }
220
220
  return t2;
221
221
  }
222
- let v = false;
222
+ let b = false;
223
223
  function buildBatches(e2, t2, n2) {
224
224
  const i2 = {};
225
225
  for (const t3 of e2) {
@@ -358,10 +358,10 @@ function clearGlobalFuncSpanState() {
358
358
  function clearStaleFuncSpanState() {
359
359
  _ = false, B = null, j = false, clearGlobalFuncSpanState(), w && console.log("[Sailfish] Cleared stale function span tracking state (backend validation failed)");
360
360
  }
361
- let N = false;
361
+ let q = false;
362
362
  function restoreFuncSpanState() {
363
- if (N) return;
364
- N = true;
363
+ if (q) return;
364
+ q = true;
365
365
  const e2 = (function loadGlobalFuncSpanState() {
366
366
  try {
367
367
  if ("undefined" == typeof localStorage) return null;
@@ -491,7 +491,7 @@ function initializeWebSocket(t2, n2, i2, o2, s2 = false) {
491
491
  const t3 = new URL(e2);
492
492
  return `${t3.hostname}${t3.port ? `:${t3.port}` : ""}`;
493
493
  })(t2);
494
- let a2 = `${"https:" === new URL(t2).protocol ? "wss" : "ws"}://${r2}/ws/notify/?apiKey=${n2}&sessionId=${i2}&sender=JS%2FTS&version=1.12.4`;
494
+ let a2 = `${"https:" === new URL(t2).protocol ? "wss" : "ws"}://${r2}/ws/notify/?apiKey=${n2}&sessionId=${i2}&sender=JS%2FTS&version=1.12.5`;
495
495
  if (o2 && (a2 += `&envValue=${encodeURIComponent(o2)}`), x = s2 ? (function tryCreateWsWorker() {
496
496
  if ("undefined" == typeof Worker) return null;
497
497
  try {
@@ -546,7 +546,7 @@ function getFuncSpanHeader() {
546
546
  }
547
547
  return { name: "X-Sf3-FunctionSpanCaptureOverride", value: "1-1-10-10-1-1.0-1-0-0" };
548
548
  }
549
- const q = Object.freeze(Object.defineProperty({ __proto__: null, clearStaleFuncSpanState, disableFunctionSpanTracking, enableFunctionSpanTracking, ensureHrefCache, flushBufferedEvents, getCachedHref, getCachedHrefNoQuery, getFuncSpanHeader, initializeFunctionSpanTrackingFromApi, initializeWebSocket, isFunctionSpanTrackingEnabled, onNavigationChange, requestTimeSync, restoreFuncSpanState, sendEvent, sendMessage }, Symbol.toStringTag, { value: "Module" }));
549
+ const N = Object.freeze(Object.defineProperty({ __proto__: null, clearStaleFuncSpanState, disableFunctionSpanTracking, enableFunctionSpanTracking, ensureHrefCache, flushBufferedEvents, getCachedHref, getCachedHrefNoQuery, getFuncSpanHeader, initializeFunctionSpanTrackingFromApi, initializeWebSocket, isFunctionSpanTrackingEnabled, onNavigationChange, requestTimeSync, restoreFuncSpanState, sendEvent, sendMessage }, Symbol.toStringTag, { value: "Module" }));
550
550
  let z = null, H = null;
551
551
  function getIdentifiedUser() {
552
552
  return z;
@@ -871,7 +871,7 @@ async function initializeRecording(e2, n2, i2, o2, s2, r2 = true, a2 = false, l2
871
871
  return (t2, n5) => closestSafe(n5, e3) ? t2 : t2.replace(/\S/g, "*");
872
872
  })(i3);
873
873
  if (l2) {
874
- const { chunkedSnapshot: a4 } = await Promise.resolve().then(() => require("./chunkSerializer-FQtY90Av.js")), l3 = n4.mirror;
874
+ const { chunkedSnapshot: a4 } = await Promise.resolve().then(() => require("./chunkSerializer-Cd8y9tID.js")), l3 = n4.mirror;
875
875
  let p2 = true;
876
876
  const f2 = [];
877
877
  n4({ emit(e3) {
@@ -1012,13 +1012,13 @@ function setIsRecording(e2) {
1012
1012
  he = e2;
1013
1013
  }
1014
1014
  const Se = ["jira", "linear", "zendesk"];
1015
- let be = null;
1016
- const ve = /* @__PURE__ */ new Map();
1015
+ let ve = null;
1016
+ const be = /* @__PURE__ */ new Map();
1017
1017
  function getIntegrationData() {
1018
- return be;
1018
+ return ve;
1019
1019
  }
1020
1020
  function hasValidIntegration() {
1021
- return null !== be && true === be.installed;
1021
+ return null !== ve && true === ve.installed;
1022
1022
  }
1023
1023
  function resolveIntegration(e2) {
1024
1024
  var _a;
@@ -1032,14 +1032,14 @@ function resolveIntegration(e2) {
1032
1032
  var _a2;
1033
1033
  return "jira" === ((_a2 = e3.provider) == null ? void 0 : _a2.toLowerCase());
1034
1034
  }) || n2[0];
1035
- return (i2 == null ? void 0 : i2.primaryCloudId) && ve.set(i2.primaryCloudId, i2), i2;
1035
+ return (i2 == null ? void 0 : i2.primaryCloudId) && be.set(i2.primaryCloudId, i2), i2;
1036
1036
  }
1037
1037
  async function refreshIntegrationData(e2, t2) {
1038
1038
  try {
1039
1039
  const n2 = resolveIntegration(await fetchEngineeringTicketPlatformIntegrations(e2, t2));
1040
- return be = n2, n2;
1040
+ return ve = n2, n2;
1041
1041
  } catch (e3) {
1042
- return console.error("Error refreshing integration data:", e3), be;
1042
+ return console.error("Error refreshing integration data:", e3), ve;
1043
1043
  }
1044
1044
  }
1045
1045
  function populateSelectOptions(e2, t2, n2) {
@@ -1084,8 +1084,8 @@ function populateSprintOptions(e2, t2, n2) {
1084
1084
  }), n2 && (e2.value = n2);
1085
1085
  }
1086
1086
  function getSprintFieldId() {
1087
- if (!(be == null ? void 0 : be.fieldConfigurations)) return "customfield_10020";
1088
- const e2 = Array.isArray(be.fieldConfigurations) ? be.fieldConfigurations : [];
1087
+ if (!(ve == null ? void 0 : ve.fieldConfigurations)) return "customfield_10020";
1088
+ const e2 = Array.isArray(ve.fieldConfigurations) ? ve.fieldConfigurations : [];
1089
1089
  for (const t2 of e2) {
1090
1090
  const e3 = (t2.fields || []).find((e4) => {
1091
1091
  var _a;
@@ -1097,12 +1097,12 @@ function getSprintFieldId() {
1097
1097
  }
1098
1098
  function updateIssueTypeOptions(e2, t2) {
1099
1099
  var _a;
1100
- if (!(be == null ? void 0 : be.projects) || !t2) {
1100
+ if (!(ve == null ? void 0 : ve.projects) || !t2) {
1101
1101
  e2.innerHTML = "";
1102
1102
  const t3 = document.createElement("option");
1103
1103
  return t3.value = "", t3.disabled = true, t3.selected = true, t3.textContent = "Select project first...", t3.style.color = "#9ca3af", e2.appendChild(t3), void (e2.style.color = "#9ca3af");
1104
1104
  }
1105
- const n2 = be.projects.find((e3) => e3.id === t2);
1105
+ const n2 = ve.projects.find((e3) => e3.id === t2);
1106
1106
  if (!n2 || !n2.issue_types) {
1107
1107
  e2.innerHTML = "";
1108
1108
  const t3 = document.createElement("option");
@@ -1126,12 +1126,12 @@ function updateIssueTypeOptions(e2, t2) {
1126
1126
  }
1127
1127
  }
1128
1128
  function getFieldsForProject(e2, t2) {
1129
- if (!(be == null ? void 0 : be.fieldConfigurations) || !e2) return [];
1130
- const n2 = Array.isArray(be.fieldConfigurations) ? be.fieldConfigurations.find((n3) => !(n3.project_key !== e2 && String(n3.project_id) !== String(e2) || t2 && String(n3.issue_type_id) !== String(t2))) : be.fieldConfigurations[e2];
1129
+ if (!(ve == null ? void 0 : ve.fieldConfigurations) || !e2) return [];
1130
+ const n2 = Array.isArray(ve.fieldConfigurations) ? ve.fieldConfigurations.find((n3) => !(n3.project_key !== e2 && String(n3.project_id) !== String(e2) || t2 && String(n3.issue_type_id) !== String(t2))) : ve.fieldConfigurations[e2];
1131
1131
  return n2 && n2.fields ? n2.fields : [];
1132
1132
  }
1133
1133
  function getUsers() {
1134
- return (be == null ? void 0 : be.users) ? be.users : [];
1134
+ return (ve == null ? void 0 : ve.users) ? ve.users : [];
1135
1135
  }
1136
1136
  function getDefaultReporterAccountId() {
1137
1137
  const e2 = getUsers(), t2 = getIdentifiedUser();
@@ -1148,8 +1148,8 @@ function getDefaultReporterAccountId() {
1148
1148
  return s2 && (s2.id || s2.accountId) || null;
1149
1149
  }
1150
1150
  function lastReporterStorageKey() {
1151
- if (!be) return null;
1152
- const e2 = be.primaryCloudId || be.provider || "";
1151
+ if (!ve) return null;
1152
+ const e2 = ve.primaryCloudId || ve.provider || "";
1153
1153
  return e2 ? `sf-veritas:lastReporter:${e2}` : null;
1154
1154
  }
1155
1155
  function getSavedLastReporterAccountId() {
@@ -1176,42 +1176,42 @@ function getValidSavedReporterAccountId() {
1176
1176
  return getUsers().some((t2) => (t2.accountId || t2.id) === e2 && false !== t2.active) ? e2 : null;
1177
1177
  }
1178
1178
  function getProjectsForTeam(e2) {
1179
- if (!be) return [];
1180
- const t2 = be.teams && Array.isArray(be.teams) && be.teams.length > 0;
1179
+ if (!ve) return [];
1180
+ const t2 = ve.teams && Array.isArray(ve.teams) && ve.teams.length > 0;
1181
1181
  if (t2 && e2) {
1182
- const t3 = be.teams.find((t4) => t4.id === e2);
1182
+ const t3 = ve.teams.find((t4) => t4.id === e2);
1183
1183
  return (t3 == null ? void 0 : t3.projects) || [];
1184
1184
  }
1185
- return !t2 && be.projects ? be.projects : [];
1185
+ return !t2 && ve.projects ? ve.projects : [];
1186
1186
  }
1187
1187
  function updateFormWithIntegrationData(e2) {
1188
1188
  var _a;
1189
- if (!be) return e2;
1190
- const t2 = be.teams && Array.isArray(be.teams) && be.teams.length > 0, n2 = document.getElementById("sf-eng-ticket-team");
1191
- n2 && t2 && (populateSelectOptions(n2, be.teams, be.defaultTeam), e2.engTicketTeam ? n2.value = e2.engTicketTeam : e2.engTicketTeam = n2.value);
1189
+ if (!ve) return e2;
1190
+ const t2 = ve.teams && Array.isArray(ve.teams) && ve.teams.length > 0, n2 = document.getElementById("sf-eng-ticket-team");
1191
+ n2 && t2 && (populateSelectOptions(n2, ve.teams, ve.defaultTeam), e2.engTicketTeam ? n2.value = e2.engTicketTeam : e2.engTicketTeam = n2.value);
1192
1192
  const i2 = document.getElementById("sf-eng-ticket-project");
1193
1193
  if (i2) {
1194
- populateSelectOptions(i2, t2 ? getProjectsForTeam(e2.engTicketTeam) : be.projects || [], be.defaultProject), e2.engTicketProject ? i2.value = e2.engTicketProject : e2.engTicketProject = i2.value;
1194
+ populateSelectOptions(i2, t2 ? getProjectsForTeam(e2.engTicketTeam) : ve.projects || [], ve.defaultProject), e2.engTicketProject ? i2.value = e2.engTicketProject : e2.engTicketProject = i2.value;
1195
1195
  }
1196
1196
  const o2 = document.getElementById("sf-eng-ticket-priority");
1197
- o2 && (populatePriorityOptions(o2, be.provider || "", be.defaultPriority), e2.engTicketPriority ? o2.value = String(e2.engTicketPriority) : e2.engTicketPriority = Number(o2.value));
1198
- const s2 = document.getElementById("sf-eng-ticket-sprint"), r2 = "jira" === ((_a = be.provider) == null ? void 0 : _a.toLowerCase());
1199
- if (s2 && r2 && be.sprints) {
1197
+ o2 && (populatePriorityOptions(o2, ve.provider || "", ve.defaultPriority), e2.engTicketPriority ? o2.value = String(e2.engTicketPriority) : e2.engTicketPriority = Number(o2.value));
1198
+ const s2 = document.getElementById("sf-eng-ticket-sprint"), r2 = "jira" === ((_a = ve.provider) == null ? void 0 : _a.toLowerCase());
1199
+ if (s2 && r2 && ve.sprints) {
1200
1200
  if (!e2.engTicketSprint && !ye) {
1201
- const t3 = pickDefaultActiveSprint(be.sprints, e2.engTicketProject, be.projects || []);
1201
+ const t3 = pickDefaultActiveSprint(ve.sprints, e2.engTicketProject, ve.projects || []);
1202
1202
  (t3 == null ? void 0 : t3.id) && (e2.engTicketSprint = String(t3.id), setSprintDefaulted(true));
1203
1203
  }
1204
- populateSprintOptions(s2, be.sprints, e2.engTicketSprint || void 0), e2.engTicketSprint && (s2.style.color = "");
1204
+ populateSprintOptions(s2, ve.sprints, e2.engTicketSprint || void 0), e2.engTicketSprint && (s2.style.color = "");
1205
1205
  }
1206
1206
  const a2 = document.getElementById("sf-eng-ticket-type");
1207
1207
  return a2 && r2 && e2.engTicketProject && (updateIssueTypeOptions(a2, e2.engTicketProject), e2.engTicketIssueType ? (a2.value = e2.engTicketIssueType, a2.style.color = "#000") : a2.value && (e2.engTicketIssueType = a2.value)), e2;
1208
1208
  }
1209
1209
  const we = Object.freeze(Object.defineProperty({ __proto__: null, fetchIntegrationData: async function fetchIntegrationData(e2, t2) {
1210
- if (!be) try {
1210
+ if (!ve) try {
1211
1211
  const n2 = await fetchEngineeringTicketPlatformIntegrations(e2, t2);
1212
- be = resolveIntegration(n2);
1212
+ ve = resolveIntegration(n2);
1213
1213
  } catch (e3) {
1214
- console.error("Error fetching integration data:", e3), be = null;
1214
+ console.error("Error fetching integration data:", e3), ve = null;
1215
1215
  }
1216
1216
  }, getDefaultReporterAccountId, getFieldsForProject, getIntegrationData, getProjectsForTeam, getSavedLastReporterAccountId, getSprintFieldId, getUsers, getValidSavedReporterAccountId, hasValidIntegration, pickDefaultActiveSprint, populatePriorityOptions, populateSelectOptions, populateSprintOptions, refreshIntegrationData, saveLastReporterAccountId, updateFormWithIntegrationData, updateIssueTypeOptions }, Symbol.toStringTag, { value: "Module" }));
1217
1217
  function renderCustomMultiSelect(e2, t2, n2, i2, o2 = false) {
@@ -1820,7 +1820,7 @@ function injectModalHTML(e2 = "lookback") {
1820
1820
  fe = e6;
1821
1821
  })(Date.now()), setIsRecording(true);
1822
1822
  try {
1823
- const { enableFunctionSpanTracking: e6 } = await Promise.resolve().then(() => q);
1823
+ const { enableFunctionSpanTracking: e6 } = await Promise.resolve().then(() => N);
1824
1824
  e6();
1825
1825
  } catch (e6) {
1826
1826
  console.error("[Report Issue] Failed to enable function span tracking:", e6);
@@ -1878,6 +1878,14 @@ function injectModalHTML(e2 = "lookback") {
1878
1878
  const e6 = getSprintFieldId();
1879
1879
  h2[e6] = parseInt(S2, 10);
1880
1880
  }
1881
+ const isFieldEmpty = (e6) => null == e6 || ("string" == typeof e6 ? "" === e6.trim() : !!Array.isArray(e6) && 0 === e6.length), v2 = (getFieldsForProject(p2, m2) || []).filter((e6) => e6 && e6.required), b2 = [];
1882
+ for (const e6 of v2) {
1883
+ const t5 = e6.fieldId || e6.key;
1884
+ if ("summary" === t5 || "description" === t5 || "priority" === t5) continue;
1885
+ let n4, i4;
1886
+ "project" === t5 ? (n4 = !!document.getElementById("sf-eng-ticket-project"), i4 = p2) : "issuetype" === t5 ? (n4 = !!document.getElementById("sf-eng-ticket-type"), i4 = m2) : (n4 = !!document.querySelector(`[data-field-id="${t5}"]`), i4 = h2[t5]), n4 && isFieldEmpty(i4) && b2.push(e6.name || t5);
1887
+ }
1888
+ if (b2.length > 0) return void alert(`Please fill in the required field${b2.length > 1 ? "s" : ""}: ${b2.join(", ")}`);
1881
1889
  closeModal(), (async function createTriageAndIssue(e6, t5, n4, i4, o4, s4, r4, a4, l4, c4, d4, u3, p3) {
1882
1890
  var _a2, _b, _c;
1883
1891
  try {
@@ -2015,7 +2023,7 @@ async function stopRecording() {
2015
2023
  ge = e2;
2016
2024
  })(Date.now()), setIsRecording(false), me && (clearInterval(me), setTimerInterval(null)), (_a = document.getElementById("sf-recording-indicator")) == null ? void 0 : _a.remove();
2017
2025
  try {
2018
- const { disableFunctionSpanTracking: e2 } = await Promise.resolve().then(() => q);
2026
+ const { disableFunctionSpanTracking: e2 } = await Promise.resolve().then(() => N);
2019
2027
  e2();
2020
2028
  } catch (e2) {
2021
2029
  console.error("[Report Issue] Failed to disable function span tracking:", e2);
@@ -2218,7 +2226,7 @@ function clearPageVisitDataFromSessionStorage() {
2218
2226
  let Oe = false;
2219
2227
  function _ensureModuleSideEffects() {
2220
2228
  Oe || (Oe = true, restoreFuncSpanState(), (function ensureSessionListeners() {
2221
- v || (v = true, f && window.addEventListener("beforeunload", () => {
2229
+ b || (b = true, f && window.addEventListener("beforeunload", () => {
2222
2230
  window.name = S + window.name;
2223
2231
  }));
2224
2232
  })(), f && (sendUserDeviceUuid(), (function sendTimeZone() {
@@ -2311,8 +2319,8 @@ function setupFetchInterceptor(e2 = [], t2 = { captureStreamingResponseBody: tru
2311
2319
  delete h2[n];
2312
2320
  const S2 = getFuncSpanHeader();
2313
2321
  S2 && delete h2[S2.name];
2314
- const b2 = `${c3}/${p2.page_visit_uuid}/${u3}`;
2315
- h2[n] = b2, S2 && (h2[S2.name] = S2.value);
2322
+ const v2 = `${c3}/${p2.page_visit_uuid}/${u3}`;
2323
+ h2[n] = v2, S2 && (h2[S2.name] = S2.value);
2316
2324
  maskAuthorizationHeader(h2);
2317
2325
  try {
2318
2326
  let S3 = await (async function injectHeader(e5, t3, i5, o5, s4, r4, a3) {
@@ -2327,7 +2335,7 @@ function setupFetchInterceptor(e2 = [], t2 = { captureStreamingResponseBody: tru
2327
2335
  const c4 = { ...o5 }, d4 = new Headers(o5.headers || {});
2328
2336
  return d4.set(n, `${s4}/${r4}/${a3}`), l3 && (d4.set(l3.name, l3.value), Ce && console.log("[Sailfish] Added funcspan header to HTTP fetch:", { url: "string" == typeof i5 ? i5 : i5.href, header: l3.name })), c4.headers = d4, await e5.call(t3, i5, c4);
2329
2337
  }
2330
- })(e4, i4, s3, r3, c3, p2.page_visit_uuid, u3), b3 = false;
2338
+ })(e4, i4, s3, r3, c3, p2.page_visit_uuid, u3), v3 = false;
2331
2339
  Ae.includes(S3.status) && (Ce && console.log("Perform retry as status was fail:", S3), delete h2[n], S3 = await (async function retryWithoutPropagateHeaders(e5, t3, i5, o5) {
2332
2340
  try {
2333
2341
  let o6 = i5[0], s4 = i5[1] || {};
@@ -2346,8 +2354,8 @@ function setupFetchInterceptor(e2 = [], t2 = { captureStreamingResponseBody: tru
2346
2354
  } catch (e6) {
2347
2355
  throw Ce && console.log(`Retry without ${n} for ${o5} also failed:`, e6), e6;
2348
2356
  }
2349
- })(e4, i4, o4, d3), b3 = true);
2350
- const v2 = Date.now(), w2 = (function captureClientTime() {
2357
+ })(e4, i4, o4, d3), v3 = true);
2358
+ const b2 = Date.now(), w2 = (function captureClientTime() {
2351
2359
  return { wallTimeMs: Date.now(), monotonicMs: monotonicNow(), timeOriginMs: timeOriginMs() };
2352
2360
  })(), k2 = S3.status, x2 = S3.ok, I2 = x2 ? "" : `Request Error: ${S3.statusText}`;
2353
2361
  let T2 = null;
@@ -2358,7 +2366,7 @@ function setupFetchInterceptor(e2 = [], t2 = { captureStreamingResponseBody: tru
2358
2366
  } catch (e5) {
2359
2367
  Ce && console.warn("[Sailfish] Failed to capture response headers:", e5), T2 = null;
2360
2368
  }
2361
- const E2 = { type: 27, timestamp: v2, sessionId: c3, client: w2, data: { request_id: u3, session_id: c3, timestamp_start: g2, timestamp_end: v2, response_code: k2, success: x2, error: I2, method: f2, url: toAbsoluteUrl(d3), retry_without_trace_id: b3, request_headers: h2, request_body: m2, response_headers: T2, response_body: null }, ...p2 }, sendEventWithBody = (e5) => {
2369
+ const E2 = { type: 27, timestamp: b2, sessionId: c3, client: w2, data: { request_id: u3, session_id: c3, timestamp_start: g2, timestamp_end: b2, response_code: k2, success: x2, error: I2, method: f2, url: toAbsoluteUrl(d3), retry_without_trace_id: v3, request_headers: h2, request_body: m2, response_headers: T2, response_body: null }, ...p2 }, sendEventWithBody = (e5) => {
2362
2370
  E2.data.response_body = e5, y2 ? y2.text().then((e6) => {
2363
2371
  E2.data.request_body = e6, sendEvent(E2);
2364
2372
  }, () => {
@@ -2446,7 +2454,7 @@ function setupFetchInterceptor(e2 = [], t2 = { captureStreamingResponseBody: tru
2446
2454
  })(e3, i3, o3, d2, u2, s2, c2);
2447
2455
  } });
2448
2456
  }
2449
- async function startRecording({ apiKey: e2, backendApi: t2 = "https://api-service.sailfishqa.com", domainsToPropagateHeaderTo: i2 = ["*"], domainsToNotPropagateHeaderTo: o2 = [], serviceVersion: s2, serviceIdentifier: r2, gitSha: a2, serviceAdditionalMetadata: l2, enableIpTracking: c2, captureStreamingResponseBody: d2 = true, captureResponseBodyMaxMb: u2 = 10, captureStreamPrefixKb: p2 = 64, captureStreamTimeoutMs: f2 = 1e4, enableFiberTracking: g2 = false, deferRecording: m2, deferRecordingStart: y2, chunkSnapshot: S2, useWsWorker: b2 = true, capturePerformanceMetrics: v2 = true, maskTextClass: w2, maskInputSelector: k2, maskTextSelector: x2, blockSelector: I2, unmaskSelector: T2, maskInputOptions: E2, library: C2, headlessRecording: M2 = false }) {
2457
+ async function startRecording({ apiKey: e2, backendApi: t2 = "https://api-service.sailfishqa.com", domainsToPropagateHeaderTo: i2 = ["*"], domainsToNotPropagateHeaderTo: o2 = [], serviceVersion: s2, serviceIdentifier: r2, gitSha: a2, serviceAdditionalMetadata: l2, enableIpTracking: c2, captureStreamingResponseBody: d2 = true, captureResponseBodyMaxMb: u2 = 10, captureStreamPrefixKb: p2 = 64, captureStreamTimeoutMs: f2 = 1e4, enableFiberTracking: g2 = false, deferRecording: m2, deferRecordingStart: y2, chunkSnapshot: S2, useWsWorker: v2 = true, capturePerformanceMetrics: b2 = true, maskTextClass: w2, maskInputSelector: k2, maskTextSelector: x2, blockSelector: I2, unmaskSelector: T2, maskInputOptions: E2, library: C2, headlessRecording: M2 = false }) {
2450
2458
  var _a, _b;
2451
2459
  if (!M2 && (function isHeadlessOrLighthouse() {
2452
2460
  try {
@@ -2533,7 +2541,7 @@ async function startRecording({ apiKey: e2, backendApi: t2 = "https://api-servic
2533
2541
  }), window.addEventListener("unhandledrejection", (e3) => {
2534
2542
  captureError(e3.reason, true);
2535
2543
  });
2536
- })(), A2.errorInit = true), await yieldToMain(), !A2.perfInit && v2 && (initializePerformancePlugin(F2), A2.perfInit = true), await yieldToMain(), _ensureModuleSideEffects(), (function storeCredentialsAndConnection({ apiKey: e3, backendApi: t3 }) {
2544
+ })(), A2.errorInit = true), await yieldToMain(), !A2.perfInit && b2 && (initializePerformancePlugin(F2), A2.perfInit = true), await yieldToMain(), _ensureModuleSideEffects(), (function storeCredentialsAndConnection({ apiKey: e3, backendApi: t3 }) {
2537
2545
  h && (sessionStorage.setItem("sailfishApiKey", e3), sessionStorage.setItem("sailfishBackendApi", t3));
2538
2546
  })({ apiKey: e2, backendApi: t2 }), !isFunctionSpanTrackingEnabled() || A2.ws && 1 === A2.ws.readyState || fetchFunctionSpanTrackingEnabled(e2, t2).then((e3) => {
2539
2547
  var _a2;
@@ -2586,7 +2594,7 @@ async function startRecording({ apiKey: e2, backendApi: t2 = "https://api-servic
2586
2594
  if ((_b = h2.data) == null ? void 0 : _b.startRecordingSession) {
2587
2595
  const n3 = (l2 == null ? void 0 : l2.env) || (l2 == null ? void 0 : l2.environment);
2588
2596
  await yieldToMain();
2589
- const i4 = await initializeRecording(y3, t2, e2, F2, n3, $2, b2, S2 ?? false);
2597
+ const i4 = await initializeRecording(y3, t2, e2, F2, n3, $2, v2, S2 ?? false);
2590
2598
  A2.ws = i4, A2.initialized = true, trackDomainChangesOnce(), A2.sentMapUuidOnce || (!(function sendMapUuidIfAvailable(e3 = "", t3 = "") {
2591
2599
  window.sfMapUuid && sendMessage({ type: "mapUuid", data: { mapUuid: window.sfMapUuid, serviceIdentifier: e3, serviceVersion: t3 } });
2592
2600
  })(r2, s2), A2.sentMapUuidOnce = true);
Binary file
Binary file
@@ -277,21 +277,21 @@ function getCachedHref() {
277
277
  function getCachedHrefNoQuery() {
278
278
  return L || ("undefined" != typeof window ? window.location.origin + window.location.pathname : "");
279
279
  }
280
- const _ = [];
281
- let P = null;
280
+ const P = [];
281
+ let _ = null;
282
282
  function queueEventForIDB(e2) {
283
- _.push(e2), _.length >= 50 ? _flushIDBQueue() : P || (P = setTimeout(_flushIDBQueue, 100));
283
+ P.push(e2), P.length >= 50 ? _flushIDBQueue() : _ || (_ = setTimeout(_flushIDBQueue, 100));
284
284
  }
285
285
  function _flushIDBQueue() {
286
- if (P && (clearTimeout(P), P = null), 0 === _.length) return;
286
+ if (_ && (clearTimeout(_), _ = null), 0 === P.length) return;
287
287
  !(async function saveEventsToIDB(e2) {
288
288
  await withStore$1("readwrite", async (t2) => {
289
289
  for (const n2 of e2) t2.add({ timestamp: Date.now(), data: n2 });
290
290
  });
291
- })(_.splice(0));
291
+ })(P.splice(0));
292
292
  }
293
293
  let B = false, O = null, j = null, U = false;
294
- const N = "sailfish_funcspan_global_state";
294
+ const q = "sailfish_funcspan_global_state";
295
295
  function wsSendPayload(e2) {
296
296
  if (!isWebSocketOpen(T)) return false;
297
297
  if (I) try {
@@ -322,7 +322,7 @@ function saveGlobalFuncSpanState(e2, t2) {
322
322
  try {
323
323
  if ("undefined" == typeof localStorage) return;
324
324
  const n2 = { enabled: e2, expirationTimestampMs: t2, savedAt: Date.now() };
325
- localStorage.setItem(N, JSON.stringify(n2)), k && console.log("[Sailfish] Saved funcSpan state to localStorage:", n2);
325
+ localStorage.setItem(q, JSON.stringify(n2)), k && console.log("[Sailfish] Saved funcSpan state to localStorage:", n2);
326
326
  } catch (e3) {
327
327
  k && console.warn("[Sailfish] Failed to save funcSpan state to localStorage:", e3);
328
328
  }
@@ -330,7 +330,7 @@ function saveGlobalFuncSpanState(e2, t2) {
330
330
  function clearGlobalFuncSpanState() {
331
331
  try {
332
332
  if ("undefined" == typeof localStorage) return;
333
- localStorage.removeItem(N), k && console.log("[Sailfish] Cleared funcSpan state from localStorage");
333
+ localStorage.removeItem(q), k && console.log("[Sailfish] Cleared funcSpan state from localStorage");
334
334
  } catch (e2) {
335
335
  k && console.warn("[Sailfish] Failed to clear funcSpan state from localStorage:", e2);
336
336
  }
@@ -338,14 +338,14 @@ function clearGlobalFuncSpanState() {
338
338
  function clearStaleFuncSpanState() {
339
339
  B = false, j = null, U = false, clearGlobalFuncSpanState(), k && console.log("[Sailfish] Cleared stale function span tracking state (backend validation failed)");
340
340
  }
341
- let q = false;
341
+ let N = false;
342
342
  function restoreFuncSpanState() {
343
- if (q) return;
344
- q = true;
343
+ if (N) return;
344
+ N = true;
345
345
  const e2 = (function loadGlobalFuncSpanState() {
346
346
  try {
347
347
  if ("undefined" == typeof localStorage) return null;
348
- const e3 = localStorage.getItem(N);
348
+ const e3 = localStorage.getItem(q);
349
349
  if (!e3) return null;
350
350
  const t2 = JSON.parse(e3);
351
351
  return k && console.log("[Sailfish] Loaded funcSpan state from localStorage:", t2), t2;
@@ -471,7 +471,7 @@ function initializeWebSocket(t2, n2, i2, o2, s2 = false) {
471
471
  const t3 = new URL(e2);
472
472
  return `${t3.hostname}${t3.port ? `:${t3.port}` : ""}`;
473
473
  })(t2);
474
- let a2 = `${"https:" === new URL(t2).protocol ? "wss" : "ws"}://${r2}/ws/notify/?apiKey=${n2}&sessionId=${i2}&sender=JS%2FTS&version=1.12.4`;
474
+ let a2 = `${"https:" === new URL(t2).protocol ? "wss" : "ws"}://${r2}/ws/notify/?apiKey=${n2}&sessionId=${i2}&sender=JS%2FTS&version=1.12.5`;
475
475
  if (o2 && (a2 += `&envValue=${encodeURIComponent(o2)}`), I = s2 ? (function tryCreateWsWorker() {
476
476
  if ("undefined" == typeof Worker) return null;
477
477
  try {
@@ -862,7 +862,7 @@ async function initializeRecording(e2, n2, i2, o2, s2, r2 = true, a2 = false, l2
862
862
  return (t2, n5) => closestSafe(n5, e3) ? t2 : t2.replace(/\S/g, "*");
863
863
  })(i3);
864
864
  if (l2) {
865
- const { chunkedSnapshot: a4 } = await import("./chunkSerializer-DDukZpgl.js"), l3 = n4.mirror;
865
+ const { chunkedSnapshot: a4 } = await import("./chunkSerializer-pkpgT-FH.js"), l3 = n4.mirror;
866
866
  let p2 = true;
867
867
  const f2 = [];
868
868
  n4({ emit(e3) {
@@ -1869,6 +1869,14 @@ function injectModalHTML(e2 = "lookback") {
1869
1869
  const e6 = getSprintFieldId();
1870
1870
  h2[e6] = parseInt(S2, 10);
1871
1871
  }
1872
+ const isFieldEmpty = (e6) => null == e6 || ("string" == typeof e6 ? "" === e6.trim() : !!Array.isArray(e6) && 0 === e6.length), b2 = (getFieldsForProject(p2, m2) || []).filter((e6) => e6 && e6.required), v2 = [];
1873
+ for (const e6 of b2) {
1874
+ const t5 = e6.fieldId || e6.key;
1875
+ if ("summary" === t5 || "description" === t5 || "priority" === t5) continue;
1876
+ let n4, i4;
1877
+ "project" === t5 ? (n4 = !!document.getElementById("sf-eng-ticket-project"), i4 = p2) : "issuetype" === t5 ? (n4 = !!document.getElementById("sf-eng-ticket-type"), i4 = m2) : (n4 = !!document.querySelector(`[data-field-id="${t5}"]`), i4 = h2[t5]), n4 && isFieldEmpty(i4) && v2.push(e6.name || t5);
1878
+ }
1879
+ if (v2.length > 0) return void alert(`Please fill in the required field${v2.length > 1 ? "s" : ""}: ${v2.join(", ")}`);
1872
1880
  closeModal(), (async function createTriageAndIssue(e6, t5, n4, i4, o4, s4, r4, a4, l4, c4, d4, u3, p3) {
1873
1881
  var _a2, _b, _c;
1874
1882
  try {
@@ -2145,9 +2153,9 @@ function getCachedRegex(e2, t2) {
2145
2153
  let i2 = $e.get(n2);
2146
2154
  return i2 || (i2 = new RegExp(e2, t2), $e.set(n2, i2)), i2;
2147
2155
  }
2148
- const Fe = new Set([".js", ".mjs", ".cjs", ".ts", ".css", ".scss", ".sass", ".less", ".styl", ".stylus", ".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".avif", ".bmp", ".ico", ".tiff", ".tif", ".heic", ".woff", ".woff2", ".ttf", ".otf", ".eot", ".mp4", ".webm", ".ogv", ".mp3", ".wav", ".flac", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".csv", ".json", ".xml", ".txt", ".zip", ".rar", ".gz", ".tar", ".7z", ".map", ".webmanifest"].map((e2) => e2.toLowerCase())), Ae = ["t.co", "*.twitter.com", "*.gravatar.com", "*.googleapis.com", "*.amazonaws.com", "*.smooch.io", "*.zendesk.com", "*.zdassets.com"], Le = [400, 403], Re = "CORS", De = 1, _e = "authorization", Pe = "Authorization", Be = { recordCanvas: false, recordCrossOriginIframes: false, collectFonts: false, inlineImages: false, recordPassword: false, recordRealName: true, recordCreditCardInfo: false, recordSsn: false, recordDob: false, sampling: {}, enableFiberTracking: false, maskInputSelector: "", maskTextSelector: "", blockSelector: "", unmaskSelector: "", maskInputOptions: { password: true } }, Oe = { level: ["info", "log", "warn", "error"], lengthThreshold: 1e4, stringifyOptions: { stringLengthLimit: 1e3, numOfKeysLimit: 20, depthOfLimit: 4 }, logger: "console" };
2156
+ const Fe = new Set([".js", ".mjs", ".cjs", ".ts", ".css", ".scss", ".sass", ".less", ".styl", ".stylus", ".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".avif", ".bmp", ".ico", ".tiff", ".tif", ".heic", ".woff", ".woff2", ".ttf", ".otf", ".eot", ".mp4", ".webm", ".ogv", ".mp3", ".wav", ".flac", ".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".csv", ".json", ".xml", ".txt", ".zip", ".rar", ".gz", ".tar", ".7z", ".map", ".webmanifest"].map((e2) => e2.toLowerCase())), Ae = ["t.co", "*.twitter.com", "*.gravatar.com", "*.googleapis.com", "*.amazonaws.com", "*.smooch.io", "*.zendesk.com", "*.zdassets.com"], Le = [400, 403], Re = "CORS", De = 1, Pe = "authorization", _e = "Authorization", Be = { recordCanvas: false, recordCrossOriginIframes: false, collectFonts: false, inlineImages: false, recordPassword: false, recordRealName: true, recordCreditCardInfo: false, recordSsn: false, recordDob: false, sampling: {}, enableFiberTracking: false, maskInputSelector: "", maskTextSelector: "", blockSelector: "", unmaskSelector: "", maskInputOptions: { password: true } }, Oe = { level: ["info", "log", "warn", "error"], lengthThreshold: 1e4, stringifyOptions: { stringLengthLimit: 1e3, numOfKeysLimit: 20, depthOfLimit: 4 }, logger: "console" };
2149
2157
  function maskAuthorizationHeader(e2) {
2150
- const t2 = e2[_e] ? _e : e2[Pe] ? Pe : null;
2158
+ const t2 = e2[Pe] ? Pe : e2[_e] ? _e : null;
2151
2159
  if (!t2) return;
2152
2160
  const n2 = e2[t2], i2 = n2.indexOf(" ");
2153
2161
  if (-1 !== i2) {
Binary file
Binary file
@@ -1283,6 +1283,54 @@ function bindListeners() {
1283
1283
  const sprintFieldId = getSprintFieldId();
1284
1284
  engTicketCustomFields[sprintFieldId] = parseInt(sprintValue, 10);
1285
1285
  }
1286
+ // Block submit when a required eng-ticket field that's actually
1287
+ // rendered has no value. We only flag fields the user can fix:
1288
+ // renderDynamicField returns null (no DOM input) for fields like a
1289
+ // user picker with no assignable users, so absence of a
1290
+ // [data-field-id] element means the field isn't on screen and is
1291
+ // skipped. The title is already validated above; priority always has
1292
+ // a default selection. (Done before closeModal so the inputs still
1293
+ // exist to probe.)
1294
+ const isFieldEmpty = (v) => {
1295
+ if (v === undefined || v === null)
1296
+ return true;
1297
+ if (typeof v === "string")
1298
+ return v.trim() === "";
1299
+ if (Array.isArray(v))
1300
+ return v.length === 0;
1301
+ return false;
1302
+ };
1303
+ const requiredFields = (getFieldsForProject(engTicketProject, engTicketIssueType) || []).filter((f) => f && f.required);
1304
+ const missingRequired = [];
1305
+ for (const f of requiredFields) {
1306
+ const fid = f.fieldId || f.key;
1307
+ if (fid === "summary" || fid === "description" || fid === "priority") {
1308
+ continue;
1309
+ }
1310
+ let rendered;
1311
+ let value;
1312
+ if (fid === "project") {
1313
+ rendered = !!document.getElementById("sf-eng-ticket-project");
1314
+ value = engTicketProject;
1315
+ }
1316
+ else if (fid === "issuetype") {
1317
+ rendered = !!document.getElementById("sf-eng-ticket-type");
1318
+ value = engTicketIssueType;
1319
+ }
1320
+ else {
1321
+ // Dynamic field — only flag when renderDynamicField produced an
1322
+ // input (its container/control carries data-field-id).
1323
+ rendered = !!document.querySelector(`[data-field-id="${fid}"]`);
1324
+ value = engTicketCustomFields[fid];
1325
+ }
1326
+ if (rendered && isFieldEmpty(value)) {
1327
+ missingRequired.push(f.name || fid);
1328
+ }
1329
+ }
1330
+ if (missingRequired.length > 0) {
1331
+ alert(`Please fill in the required field${missingRequired.length > 1 ? "s" : ""}: ${missingRequired.join(", ")}`);
1332
+ return;
1333
+ }
1286
1334
  closeModal();
1287
1335
  // Create triage + issue (with optional engineering ticket)
1288
1336
  createTriageAndIssue(`${startTimestamp}`, `${endTimestamp}`, desc, issueName, issueDescription, currentState.createEngTicket, engTicketTeam, engTicketProject, engTicketPriority, engTicketLabels, engTicketIssueType, engTicketCustomFields, mode === "startnow" ? "RECORDED" : "LOOKBACK");
package/dist/recorder.cjs CHANGED
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const e = require("./chunks/index-C-qbsfKe.js");
3
+ const e = require("./chunks/index-Bvd8oTpV.js");
4
4
  exports.DEFAULT_CAPTURE_SETTINGS = e.DEFAULT_CAPTURE_SETTINGS, exports.DEFAULT_CONSOLE_RECORDING_SETTINGS = e.DEFAULT_CONSOLE_RECORDING_SETTINGS, exports.STORAGE_VERSION = e.STORAGE_VERSION, exports.addOrUpdateMetadata = e.addOrUpdateMetadata, exports.buildBatches = e.buildBatches, exports.clearStaleFuncSpanState = e.clearStaleFuncSpanState, exports.createSkipHeadersPropagationChecker = e.createSkipHeadersPropagationChecker, exports.createTriageAndIssueFromRecorder = e.createTriageAndIssueFromRecorder, exports.createTriageFromRecorder = e.createTriageFromRecorder, exports.disableFunctionSpanTracking = e.disableFunctionSpanTracking, exports.enableFunctionSpanTracking = e.enableFunctionSpanTracking, exports.ensureHrefCache = e.ensureHrefCache, exports.eventSize = e.eventSize, exports.fetchAndSendIp = e.fetchAndSendIp, exports.fetchCaptureSettings = e.fetchCaptureSettings, exports.fetchEngineeringTicketPlatformIntegrations = e.fetchEngineeringTicketPlatformIntegrations, exports.fetchFunctionSpanTrackingEnabled = e.fetchFunctionSpanTrackingEnabled, exports.flushBufferedEvents = e.flushBufferedEvents, exports.getCachedHref = e.getCachedHref, exports.getCachedHrefNoQuery = e.getCachedHrefNoQuery, exports.getFuncSpanHeader = e.getFuncSpanHeader, exports.getIdentifiedUser = e.getIdentifiedUser, exports.getOrSetSessionId = e.getOrSetSessionId, exports.getUrlAndStoredUuids = e.getUrlAndStoredUuids, exports.identify = e.identify, exports.initRecorder = e.initRecorder, exports.initializeConsolePlugin = e.initializeConsolePlugin, exports.initializeDomContentEvents = e.initializeDomContentEvents, exports.initializeFunctionSpanTrackingFromApi = e.initializeFunctionSpanTrackingFromApi, exports.initializePerformancePlugin = e.initializePerformancePlugin, exports.initializeRecording = e.initializeRecording, exports.initializeWebSocket = e.initializeWebSocket, exports.invalidateUrlCache = e.invalidateUrlCache, exports.isFunctionSpanTrackingEnabled = e.isFunctionSpanTrackingEnabled, exports.maskInputFn = e.maskInputFn, exports.matchUrlWithWildcard = e.matchUrlWithWildcard, Object.defineProperty(exports, "nowTimestamp", { enumerable: true, get: () => e.nowTimestamp }), exports.onNavigationChange = e.onNavigationChange, exports.openReportIssueModal = e.openReportIssueModal, exports.requestTimeSync = e.requestTimeSync, exports.restoreFuncSpanState = e.restoreFuncSpanState, exports.sendDomainsToNotPropagateHeaderTo = e.sendDomainsToNotPropagateHeaderTo, exports.sendEvent = e.sendEvent, exports.sendGraphQLRequest = e.sendGraphQLRequest, exports.sendMessage = e.sendMessage, exports.startRecording = e.startRecording, exports.startRecordingSession = e.startRecordingSession, exports.toAbsoluteUrl = e.toAbsoluteUrl, exports.trackingEvent = e.trackingEvent, exports.withAppUrlMetadata = e.withAppUrlMetadata;
Binary file
Binary file
package/dist/recorder.js CHANGED
@@ -1,4 +1,4 @@
1
- import { D, a, S, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, z, A, B, C, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, T, U, V, W, X, Y } from "./chunks/index-D6axlCRu.js";
1
+ import { D, a, S, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, z, A, B, C, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, T, U, V, W, X, Y } from "./chunks/index-CXvHbLRT.js";
2
2
  export {
3
3
  D as DEFAULT_CAPTURE_SETTINGS,
4
4
  a as DEFAULT_CONSOLE_RECORDING_SETTINGS,
Binary file
Binary file
@@ -694,7 +694,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
694
694
  const w3 = new URL(e3);
695
695
  return `${w3.hostname}${w3.port ? `:${w3.port}` : ""}`;
696
696
  })(e2);
697
- let _2 = `${"https:" === new URL(e2).protocol ? "wss" : "ws"}://${M2}/ws/notify/?apiKey=${w2}&sessionId=${C2}&sender=JS%2FTS&version=1.12.4`;
697
+ let _2 = `${"https:" === new URL(e2).protocol ? "wss" : "ws"}://${M2}/ws/notify/?apiKey=${w2}&sessionId=${C2}&sender=JS%2FTS&version=1.12.5`;
698
698
  if (x2 && (_2 += `&envValue=${encodeURIComponent(x2)}`), de = I2 ? (function tryCreateWsWorker() {
699
699
  if ("undefined" == typeof Worker) return null;
700
700
  try {
@@ -2083,6 +2083,14 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
2083
2083
  const e6 = getSprintFieldId();
2084
2084
  Z2[e6] = parseInt(ee2, 10);
2085
2085
  }
2086
+ const isFieldEmpty = (e6) => null == e6 || ("string" == typeof e6 ? "" === e6.trim() : !!Array.isArray(e6) && 0 === e6.length), te2 = (getFieldsForProject(K2, Q2) || []).filter((e6) => e6 && e6.required), ne2 = [];
2087
+ for (const e6 of te2) {
2088
+ const w5 = e6.fieldId || e6.key;
2089
+ if ("summary" === w5 || "description" === w5 || "priority" === w5) continue;
2090
+ let C4, x4;
2091
+ "project" === w5 ? (C4 = !!document.getElementById("sf-eng-ticket-project"), x4 = K2) : "issuetype" === w5 ? (C4 = !!document.getElementById("sf-eng-ticket-type"), x4 = Q2) : (C4 = !!document.querySelector(`[data-field-id="${w5}"]`), x4 = Z2[w5]), C4 && isFieldEmpty(x4) && ne2.push(e6.name || w5);
2092
+ }
2093
+ if (ne2.length > 0) return void alert(`Please fill in the required field${ne2.length > 1 ? "s" : ""}: ${ne2.join(", ")}`);
2086
2094
  closeModal(), (async function createTriageAndIssue(e6, w5, C4, x4, I4, M4, _4, U4, j4, z4, W4, H3, K3) {
2087
2095
  var _a3, _b, _c2;
2088
2096
  try {
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sailfish-ai/recorder",
3
- "version": "1.12.4",
3
+ "version": "1.12.5",
4
4
  "publishPublicly": true,
5
5
  "publishToCdn": {
6
6
  "jsdelivr": true,
Binary file
Binary file
Binary file
Binary file