@ryuzaki13/react-foundation-lib 1.1.16 → 1.1.17
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorInfo.d.ts","sourceRoot":"","sources":["../../src/error-report/errorInfo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"errorInfo.d.ts","sourceRoot":"","sources":["../../src/error-report/errorInfo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AA0CpD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CA4BpE"}
|
|
@@ -44,7 +44,7 @@ function d(e) {
|
|
|
44
44
|
}
|
|
45
45
|
//#endregion
|
|
46
46
|
//#region src/error-report/breadcrumbs.ts
|
|
47
|
-
var f = 20, ee = 80,
|
|
47
|
+
var f = 20, ee = 80, te = 120, ne = [
|
|
48
48
|
"button",
|
|
49
49
|
"a",
|
|
50
50
|
"input",
|
|
@@ -55,71 +55,71 @@ var f = 20, ee = 80, p = 120, m = [
|
|
|
55
55
|
"[title]",
|
|
56
56
|
"[data-ui]",
|
|
57
57
|
"[data-action]"
|
|
58
|
-
].join(","),
|
|
59
|
-
function
|
|
58
|
+
].join(","), p = [];
|
|
59
|
+
function m() {
|
|
60
60
|
return (/* @__PURE__ */ new Date()).toISOString();
|
|
61
61
|
}
|
|
62
|
-
function
|
|
63
|
-
|
|
62
|
+
function h(e) {
|
|
63
|
+
p = [...p, {
|
|
64
64
|
...e,
|
|
65
|
-
utc: e.utc ??
|
|
65
|
+
utc: e.utc ?? m()
|
|
66
66
|
}].slice(-80);
|
|
67
67
|
}
|
|
68
|
-
function
|
|
69
|
-
return
|
|
68
|
+
function g() {
|
|
69
|
+
return p;
|
|
70
70
|
}
|
|
71
|
-
function
|
|
72
|
-
|
|
71
|
+
function _() {
|
|
72
|
+
p = [];
|
|
73
73
|
}
|
|
74
|
-
function
|
|
75
|
-
return t(e,
|
|
74
|
+
function v(e) {
|
|
75
|
+
return t(e, te);
|
|
76
76
|
}
|
|
77
|
-
function
|
|
77
|
+
function y(e) {
|
|
78
78
|
return {
|
|
79
|
-
id:
|
|
80
|
-
role:
|
|
81
|
-
type:
|
|
82
|
-
title:
|
|
83
|
-
ariaLabel:
|
|
84
|
-
dataUi:
|
|
85
|
-
dataAction:
|
|
79
|
+
id: v(e.id),
|
|
80
|
+
role: v(e.getAttribute("role")),
|
|
81
|
+
type: v(e.getAttribute("type")),
|
|
82
|
+
title: v(e.getAttribute("title")),
|
|
83
|
+
ariaLabel: v(e.getAttribute("aria-label")),
|
|
84
|
+
dataUi: v(e.getAttribute("data-ui")),
|
|
85
|
+
dataAction: v(e.getAttribute("data-action"))
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
|
-
function
|
|
88
|
+
function re(e) {
|
|
89
89
|
if (!(e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement || e instanceof HTMLSelectElement) && e.matches("button,a,[role],[aria-label],[title]")) return t(e.textContent, ee);
|
|
90
90
|
}
|
|
91
|
-
function
|
|
91
|
+
function ie(e) {
|
|
92
92
|
return typeof CSS < "u" && typeof CSS.escape == "function" ? CSS.escape(e) : e.replace(/["\\#.[\]>~+:]/g, "\\$&");
|
|
93
93
|
}
|
|
94
|
-
function
|
|
95
|
-
let t =
|
|
96
|
-
return t.id && n.push(`#${
|
|
94
|
+
function b(e) {
|
|
95
|
+
let t = y(e), n = [e.tagName.toLowerCase()];
|
|
96
|
+
return t.id && n.push(`#${ie(t.id)}`), t.role && n.push(`[role="${t.role}"]`), t.type && n.push(`[type="${t.type}"]`), t.dataUi && n.push(`[data-ui="${t.dataUi}"]`), t.dataAction && n.push(`[data-action="${t.dataAction}"]`), n.join("");
|
|
97
97
|
}
|
|
98
|
-
function
|
|
99
|
-
let t =
|
|
98
|
+
function x(e) {
|
|
99
|
+
let t = y(e);
|
|
100
100
|
return {
|
|
101
101
|
tag: e.tagName.toLowerCase(),
|
|
102
|
-
selector:
|
|
103
|
-
text:
|
|
102
|
+
selector: b(e),
|
|
103
|
+
text: re(e),
|
|
104
104
|
...t
|
|
105
105
|
};
|
|
106
106
|
}
|
|
107
|
-
function
|
|
107
|
+
function S(e) {
|
|
108
108
|
return Object.fromEntries(Object.entries(e).filter(([, e]) => e !== void 0 && (!Array.isArray(e) || e.length > 0)));
|
|
109
109
|
}
|
|
110
|
-
function
|
|
110
|
+
function C(e) {
|
|
111
111
|
let t = [], n = e;
|
|
112
112
|
for (; n && n !== document.documentElement && t.length < f && (t.push(n), n !== document.body);) n = n.parentElement;
|
|
113
113
|
return t;
|
|
114
114
|
}
|
|
115
|
-
function
|
|
116
|
-
return e.closest(
|
|
117
|
-
}
|
|
118
|
-
function ie(e) {
|
|
119
|
-
if (e instanceof Element) return w(T(e)).map((e) => x(e)).join(" > ");
|
|
115
|
+
function w(e) {
|
|
116
|
+
return e.closest(ne) ?? e;
|
|
120
117
|
}
|
|
121
118
|
function ae(e) {
|
|
122
|
-
|
|
119
|
+
if (e instanceof Element) return C(w(e)).map((e) => b(e)).join(" > ");
|
|
120
|
+
}
|
|
121
|
+
function T(e) {
|
|
122
|
+
let t = e.target instanceof Element ? e.target : void 0, n = t ? w(t) : void 0, r = n ? C(n).map((e) => S(x(e))) : [];
|
|
123
123
|
return d({
|
|
124
124
|
button: e.button,
|
|
125
125
|
ctrlKey: e.ctrlKey,
|
|
@@ -127,20 +127,20 @@ function ae(e) {
|
|
|
127
127
|
altKey: e.altKey,
|
|
128
128
|
clientX: e.clientX,
|
|
129
129
|
clientY: e.clientY,
|
|
130
|
-
target: n ?
|
|
130
|
+
target: n ? S(x(n)) : void 0,
|
|
131
131
|
chain: r
|
|
132
132
|
});
|
|
133
133
|
}
|
|
134
134
|
function oe() {
|
|
135
135
|
if (typeof window > "u") return () => void 0;
|
|
136
136
|
let e = (e) => {
|
|
137
|
-
|
|
137
|
+
h({
|
|
138
138
|
type: "click",
|
|
139
|
-
target:
|
|
140
|
-
detail:
|
|
139
|
+
target: ae(e.target),
|
|
140
|
+
detail: T(e)
|
|
141
141
|
});
|
|
142
142
|
}, t = () => {
|
|
143
|
-
|
|
143
|
+
h({
|
|
144
144
|
type: "visibility",
|
|
145
145
|
detail: d({ visibilityState: document.visibilityState })
|
|
146
146
|
});
|
|
@@ -151,7 +151,11 @@ function oe() {
|
|
|
151
151
|
}
|
|
152
152
|
//#endregion
|
|
153
153
|
//#region src/error-report/errorInfo.ts
|
|
154
|
-
|
|
154
|
+
var E = "Неизвестная ошибка";
|
|
155
|
+
function D(t) {
|
|
156
|
+
return e(t) ? t : E;
|
|
157
|
+
}
|
|
158
|
+
function O(e) {
|
|
155
159
|
let t = e.status ?? e.statusCode ?? e.httpStatus;
|
|
156
160
|
return typeof t == "number" && Number.isFinite(t) ? t : void 0;
|
|
157
161
|
}
|
|
@@ -164,37 +168,37 @@ function se(t) {
|
|
|
164
168
|
name: "AppError",
|
|
165
169
|
message: i,
|
|
166
170
|
code: e(r.code),
|
|
167
|
-
httpStatus:
|
|
171
|
+
httpStatus: O(r)
|
|
168
172
|
} : null;
|
|
169
173
|
}
|
|
170
|
-
function
|
|
174
|
+
function k(e) {
|
|
171
175
|
let t = se(e);
|
|
172
176
|
if (t) return t;
|
|
173
177
|
if (e instanceof Error) return {
|
|
174
178
|
name: e.name || "Error",
|
|
175
|
-
message: e.message,
|
|
179
|
+
message: D(e.message),
|
|
176
180
|
stackTrace: e.stack
|
|
177
181
|
};
|
|
178
182
|
if (e && typeof e == "object") {
|
|
179
183
|
let t = e;
|
|
180
184
|
return {
|
|
181
185
|
name: typeof t.name == "string" ? t.name : "Error",
|
|
182
|
-
message: typeof t.message == "string" ? t.message : String(e),
|
|
186
|
+
message: D(typeof t.message == "string" ? t.message : String(e)),
|
|
183
187
|
stackTrace: typeof t.stack == "string" ? t.stack : void 0,
|
|
184
|
-
httpStatus:
|
|
188
|
+
httpStatus: O(t)
|
|
185
189
|
};
|
|
186
190
|
}
|
|
187
191
|
return {
|
|
188
192
|
name: "Error",
|
|
189
|
-
message: typeof e == "string" ? e : String(e ??
|
|
193
|
+
message: D(typeof e == "string" ? e : String(e ?? E))
|
|
190
194
|
};
|
|
191
195
|
}
|
|
192
196
|
//#endregion
|
|
193
197
|
//#region src/error-report/diagnostics.ts
|
|
194
|
-
function
|
|
198
|
+
function A(e) {
|
|
195
199
|
return d(e);
|
|
196
200
|
}
|
|
197
|
-
function
|
|
201
|
+
function j(e) {
|
|
198
202
|
return {
|
|
199
203
|
queryHash: e.queryHash,
|
|
200
204
|
queryKey: l(e.queryKey),
|
|
@@ -205,25 +209,25 @@ function k(e) {
|
|
|
205
209
|
failureCount: e.state.fetchFailureCount,
|
|
206
210
|
isInvalidated: e.state.isInvalidated,
|
|
207
211
|
observersCount: e.getObserversCount(),
|
|
208
|
-
meta:
|
|
212
|
+
meta: A(e.meta),
|
|
209
213
|
dataShape: u(e.state.data),
|
|
210
|
-
error: e.state.error ?
|
|
214
|
+
error: e.state.error ? k(e.state.error) : void 0
|
|
211
215
|
};
|
|
212
216
|
}
|
|
213
|
-
function
|
|
217
|
+
function M(e) {
|
|
214
218
|
return {
|
|
215
219
|
mutationKey: e.options.mutationKey ? l(e.options.mutationKey) : void 0,
|
|
216
220
|
status: e.state.status,
|
|
217
221
|
failureCount: e.state.failureCount,
|
|
218
222
|
submittedAt: e.state.submittedAt,
|
|
219
|
-
meta:
|
|
220
|
-
error: e.state.error ?
|
|
223
|
+
meta: A(e.meta),
|
|
224
|
+
error: e.state.error ? k(e.state.error) : void 0
|
|
221
225
|
};
|
|
222
226
|
}
|
|
223
|
-
function
|
|
227
|
+
function N(e) {
|
|
224
228
|
return {
|
|
225
|
-
queries: e.getQueryCache().getAll().slice(-40).map(
|
|
226
|
-
mutations: e.getMutationCache().getAll().slice(-40).map(
|
|
229
|
+
queries: e.getQueryCache().getAll().slice(-40).map(j),
|
|
230
|
+
mutations: e.getMutationCache().getAll().slice(-40).map(M)
|
|
227
231
|
};
|
|
228
232
|
}
|
|
229
233
|
function ce(e, t) {
|
|
@@ -238,10 +242,10 @@ function ce(e, t) {
|
|
|
238
242
|
dataUpdatedAt: n.dataUpdatedAt,
|
|
239
243
|
errorUpdatedAt: n.errorUpdatedAt,
|
|
240
244
|
failureCount: n.fetchFailureCount,
|
|
241
|
-
error: n.error ?
|
|
245
|
+
error: n.error ? k(n.error) : void 0
|
|
242
246
|
};
|
|
243
247
|
}
|
|
244
|
-
async function
|
|
248
|
+
async function P() {
|
|
245
249
|
let e = i();
|
|
246
250
|
if (!e?.entries) return [];
|
|
247
251
|
try {
|
|
@@ -252,17 +256,17 @@ async function M() {
|
|
|
252
256
|
}
|
|
253
257
|
//#endregion
|
|
254
258
|
//#region src/error-report/environment.ts
|
|
255
|
-
function
|
|
259
|
+
function F(e = {}) {
|
|
256
260
|
let t = e.isDev ?? __DEV__;
|
|
257
261
|
return typeof window < "u" && !t;
|
|
258
262
|
}
|
|
259
|
-
function
|
|
263
|
+
function I() {
|
|
260
264
|
return {
|
|
261
265
|
mode: __DEV__ ? "development" : "production",
|
|
262
266
|
buildId: typeof __APP_BUILD_ID__ == "string" ? __APP_BUILD_ID__ : void 0
|
|
263
267
|
};
|
|
264
268
|
}
|
|
265
|
-
function
|
|
269
|
+
function L() {
|
|
266
270
|
if (!(typeof window > "u")) return {
|
|
267
271
|
userAgent: window.navigator.userAgent,
|
|
268
272
|
language: window.navigator.language,
|
|
@@ -271,71 +275,71 @@ function F() {
|
|
|
271
275
|
}
|
|
272
276
|
//#endregion
|
|
273
277
|
//#region src/error-report/drafts.ts
|
|
274
|
-
var
|
|
275
|
-
function
|
|
278
|
+
var R = `${__APP_ID__}.errorReport.drafts.v1`, z = `${__APP_ID__}.errorReport.sessionId.v1`, B = H();
|
|
279
|
+
function V() {
|
|
276
280
|
return r(/* @__PURE__ */ new Date());
|
|
277
281
|
}
|
|
278
|
-
function
|
|
282
|
+
function H() {
|
|
279
283
|
if (typeof sessionStorage > "u") return [];
|
|
280
284
|
try {
|
|
281
|
-
let e = sessionStorage.getItem(
|
|
285
|
+
let e = sessionStorage.getItem(R), t = e ? JSON.parse(e) : [];
|
|
282
286
|
return Array.isArray(t) ? t : [];
|
|
283
287
|
} catch {
|
|
284
288
|
return [];
|
|
285
289
|
}
|
|
286
290
|
}
|
|
287
|
-
function
|
|
288
|
-
if (
|
|
289
|
-
sessionStorage.setItem(
|
|
291
|
+
function U(e) {
|
|
292
|
+
if (B = e.slice(-10), !(typeof sessionStorage > "u")) try {
|
|
293
|
+
sessionStorage.setItem(R, JSON.stringify(B));
|
|
290
294
|
} catch {}
|
|
291
295
|
}
|
|
292
|
-
function
|
|
296
|
+
function W() {
|
|
293
297
|
if (!(typeof window > "u")) return {
|
|
294
298
|
pathname: window.location.pathname,
|
|
295
299
|
origin: window.location.origin
|
|
296
300
|
};
|
|
297
301
|
}
|
|
298
|
-
function
|
|
302
|
+
function le() {
|
|
299
303
|
if (!(typeof window > "u")) return {
|
|
300
304
|
width: window.innerWidth,
|
|
301
305
|
height: window.innerHeight,
|
|
302
306
|
devicePixelRatio: window.devicePixelRatio
|
|
303
307
|
};
|
|
304
308
|
}
|
|
305
|
-
function
|
|
306
|
-
return
|
|
309
|
+
function G(e) {
|
|
310
|
+
return B.find((t) => t.reportId === e);
|
|
307
311
|
}
|
|
308
|
-
function
|
|
309
|
-
let n =
|
|
312
|
+
function ue(e, t) {
|
|
313
|
+
let n = G(e);
|
|
310
314
|
if (!n) return;
|
|
311
315
|
let r = {
|
|
312
316
|
...n,
|
|
313
317
|
...t
|
|
314
318
|
};
|
|
315
|
-
return
|
|
319
|
+
return U(B.map((t) => t.reportId === e ? r : t)), r;
|
|
316
320
|
}
|
|
317
|
-
function
|
|
318
|
-
return
|
|
321
|
+
function de() {
|
|
322
|
+
return B;
|
|
319
323
|
}
|
|
320
|
-
function
|
|
321
|
-
if (!
|
|
322
|
-
let t = n(), r = a(
|
|
324
|
+
function K(e) {
|
|
325
|
+
if (!F()) return;
|
|
326
|
+
let t = n(), r = a(z), i = V(), o = {
|
|
323
327
|
reportId: t,
|
|
324
328
|
sessionId: r,
|
|
325
329
|
createdUtc: i,
|
|
326
330
|
category: e.category,
|
|
327
331
|
source: e.source,
|
|
328
332
|
error: e.error,
|
|
329
|
-
environment:
|
|
330
|
-
client:
|
|
331
|
-
location:
|
|
332
|
-
viewport:
|
|
333
|
+
environment: I(),
|
|
334
|
+
client: L(),
|
|
335
|
+
location: W(),
|
|
336
|
+
viewport: le(),
|
|
333
337
|
react: e.react,
|
|
334
338
|
query: e.query,
|
|
335
339
|
mutation: e.mutation,
|
|
336
340
|
queryClient: e.queryClient,
|
|
337
341
|
persistedQueries: e.persistedQueries,
|
|
338
|
-
breadcrumbs:
|
|
342
|
+
breadcrumbs: g(),
|
|
339
343
|
context: e.context
|
|
340
344
|
}, s = {
|
|
341
345
|
reportId: t,
|
|
@@ -345,12 +349,12 @@ function G(e) {
|
|
|
345
349
|
status: "pending",
|
|
346
350
|
payload: o
|
|
347
351
|
};
|
|
348
|
-
return
|
|
352
|
+
return U([...B, s]), s;
|
|
349
353
|
}
|
|
350
354
|
//#endregion
|
|
351
355
|
//#region src/error-report/transport.ts
|
|
352
|
-
var
|
|
353
|
-
function
|
|
356
|
+
var q = 6e4, fe = 100, pe = 250, J, Y = /* @__PURE__ */ new WeakSet(), X = /* @__PURE__ */ new WeakSet(), Z = /* @__PURE__ */ new Map();
|
|
357
|
+
function me(e) {
|
|
354
358
|
return [
|
|
355
359
|
e.source,
|
|
356
360
|
e.method,
|
|
@@ -359,35 +363,35 @@ function pe(e) {
|
|
|
359
363
|
e.responseUrl
|
|
360
364
|
].filter(Boolean).join("|");
|
|
361
365
|
}
|
|
362
|
-
function me(e) {
|
|
363
|
-
let t = Date.now(), n = pe(e);
|
|
364
|
-
for (let [e, n] of X) (t - n > K || X.size > de) && X.delete(e);
|
|
365
|
-
let r = X.get(n);
|
|
366
|
-
return r && t - r < K ? !0 : (X.set(n, t), !1);
|
|
367
|
-
}
|
|
368
366
|
function he(e) {
|
|
369
|
-
|
|
367
|
+
let t = Date.now(), n = me(e);
|
|
368
|
+
for (let [e, n] of Z) (t - n > q || Z.size > fe) && Z.delete(e);
|
|
369
|
+
let r = Z.get(n);
|
|
370
|
+
return r && t - r < q ? !0 : (Z.set(n, t), !1);
|
|
370
371
|
}
|
|
371
372
|
function ge(e) {
|
|
372
|
-
|
|
373
|
+
J = e, Z.clear();
|
|
374
|
+
}
|
|
375
|
+
function _e(e) {
|
|
376
|
+
return e instanceof Error && Y.has(e);
|
|
373
377
|
}
|
|
374
|
-
function
|
|
375
|
-
e instanceof Error &&
|
|
378
|
+
function Q(e) {
|
|
379
|
+
e instanceof Error && X.add(e);
|
|
376
380
|
}
|
|
377
|
-
function
|
|
378
|
-
|
|
379
|
-
if (!
|
|
380
|
-
let n =
|
|
381
|
+
function ve(e, t) {
|
|
382
|
+
Y.add(e), setTimeout(() => {
|
|
383
|
+
if (!X.has(e) && J && !he(t)) try {
|
|
384
|
+
let n = J(e, t);
|
|
381
385
|
Promise.resolve(n).catch(() => void 0);
|
|
382
386
|
} catch {}
|
|
383
|
-
},
|
|
387
|
+
}, pe);
|
|
384
388
|
}
|
|
385
389
|
//#endregion
|
|
386
390
|
//#region src/error-report/capture.ts
|
|
387
|
-
async function
|
|
388
|
-
|
|
391
|
+
async function ye(e, t, n, r) {
|
|
392
|
+
Q(e);
|
|
389
393
|
let i = r?.source ?? "query";
|
|
390
|
-
|
|
394
|
+
h({
|
|
391
395
|
type: "query-error",
|
|
392
396
|
detail: d({
|
|
393
397
|
queryHash: t.queryHash,
|
|
@@ -395,40 +399,40 @@ async function _e(e, t, n, r) {
|
|
|
395
399
|
...r?.detail
|
|
396
400
|
})
|
|
397
401
|
});
|
|
398
|
-
let [a, o] = await Promise.all([
|
|
399
|
-
return
|
|
402
|
+
let [a, o] = await Promise.all([P(), Promise.resolve(N(n))]);
|
|
403
|
+
return K({
|
|
400
404
|
category: "query",
|
|
401
405
|
source: i,
|
|
402
|
-
error: r?.errorInfo ??
|
|
403
|
-
query:
|
|
406
|
+
error: r?.errorInfo ?? k(e),
|
|
407
|
+
query: j(t),
|
|
404
408
|
queryClient: o,
|
|
405
409
|
persistedQueries: a,
|
|
406
410
|
context: d(r?.detail)
|
|
407
411
|
});
|
|
408
412
|
}
|
|
409
|
-
async function
|
|
410
|
-
|
|
413
|
+
async function be(e, t, n, r = {}) {
|
|
414
|
+
Q(e);
|
|
411
415
|
let i = r.source ?? "mutation";
|
|
412
|
-
|
|
416
|
+
h({
|
|
413
417
|
type: "mutation-error",
|
|
414
418
|
detail: d({
|
|
415
419
|
mutationKey: t.options.mutationKey,
|
|
416
420
|
...r.detail
|
|
417
421
|
})
|
|
418
422
|
});
|
|
419
|
-
let [a, o] = await Promise.all([
|
|
420
|
-
return
|
|
423
|
+
let [a, o] = await Promise.all([P(), Promise.resolve(N(n))]);
|
|
424
|
+
return K({
|
|
421
425
|
category: "mutation",
|
|
422
426
|
source: i,
|
|
423
|
-
error: r.errorInfo ??
|
|
424
|
-
mutation:
|
|
427
|
+
error: r.errorInfo ?? k(e),
|
|
428
|
+
mutation: M(t),
|
|
425
429
|
queryClient: o,
|
|
426
430
|
persistedQueries: a
|
|
427
431
|
});
|
|
428
432
|
}
|
|
429
|
-
async function
|
|
433
|
+
async function xe(e, t = {}, n) {
|
|
430
434
|
let r = t.source ?? t.category ?? "runtime";
|
|
431
|
-
|
|
435
|
+
h({
|
|
432
436
|
type: "runtime-error",
|
|
433
437
|
detail: d({
|
|
434
438
|
category: t.category ?? "runtime",
|
|
@@ -436,11 +440,11 @@ async function ye(e, t = {}, n) {
|
|
|
436
440
|
...t.detail
|
|
437
441
|
})
|
|
438
442
|
});
|
|
439
|
-
let [i, a] = n ? await Promise.all([
|
|
440
|
-
return
|
|
443
|
+
let [i, a] = n ? await Promise.all([P(), Promise.resolve(N(n))]) : [void 0, void 0];
|
|
444
|
+
return K({
|
|
441
445
|
category: t.category ?? "runtime",
|
|
442
446
|
source: r,
|
|
443
|
-
error: t.errorInfo ??
|
|
447
|
+
error: t.errorInfo ?? k(e),
|
|
444
448
|
react: t.componentStack ? { componentStack: t.componentStack } : void 0,
|
|
445
449
|
queryClient: a,
|
|
446
450
|
persistedQueries: i,
|
|
@@ -450,15 +454,15 @@ async function ye(e, t = {}, n) {
|
|
|
450
454
|
//#endregion
|
|
451
455
|
//#region src/error-report/runtime.ts
|
|
452
456
|
var $;
|
|
453
|
-
function
|
|
457
|
+
function Se(e) {
|
|
454
458
|
$ = e;
|
|
455
459
|
}
|
|
456
|
-
async function
|
|
460
|
+
async function Ce(e, t = {}) {
|
|
457
461
|
if ($) try {
|
|
458
462
|
await $(e, t);
|
|
459
463
|
} catch {}
|
|
460
464
|
}
|
|
461
465
|
//#endregion
|
|
462
|
-
export {
|
|
466
|
+
export { h as addErrorReportBreadcrumb, K as captureErrorReportDraft, be as captureMutationErrorReport, ye as captureQueryErrorReport, xe as captureRuntimeErrorReport, _ as clearErrorReportBreadcrumbs, M as collectMutationDiagnostics, P as collectPersistedQueryDiagnostics, N as collectQueryClientDiagnostics, j as collectQueryDiagnostics, u as createDataShape, l as createDiagnosticValue, k as createErrorInfo, g as getErrorReportBreadcrumbs, L as getErrorReportClientEnvironment, G as getErrorReportDraft, de as getErrorReportDrafts, I as getErrorReportEnvironment, oe as installErrorReportBrowserBreadcrumbs, F as isErrorReportingEnabled, _e as isTransportErrorReportScheduled, Ce as reportRuntimeError, ve as reportTransportError, d as sanitizeDetail, Se as setErrorReportRuntimeErrorReporter, ge as setErrorReportTransportErrorReporter, Q as suppressTransportErrorReport, ue as updateErrorReportDraft };
|
|
463
467
|
|
|
464
468
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/error-report/safeValue.ts","../../src/error-report/breadcrumbs.ts","../../src/error-report/errorInfo.ts","../../src/error-report/diagnostics.ts","../../src/error-report/environment.ts","../../src/error-report/drafts.ts","../../src/error-report/transport.ts","../../src/error-report/capture.ts","../../src/error-report/runtime.ts"],"sourcesContent":["import type { ErrorReportSafeValue } from \"./types\";\n\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\nconst MAX_OBJECT_KEYS = 40;\n\n/**\n * Превращает произвольное значение в JSON-совместимую диагностическую форму.\n * Значения сохраняются читаемыми, потому что queryKey/meta/context нужны\n * для восстановления пользовательского сценария; тяжелые данные query cache\n * отсекаются отдельно и сюда не передаются.\n */\nexport function createDiagnosticValue(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (value instanceof Date) return value.toISOString();\n\tif (Array.isArray(value)) {\n\t\treturn value.slice(0, MAX_ARRAY_ITEMS).map((item) => createDiagnosticValue(item, depth + 1));\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn Object.fromEntries(entries.map(([key, item]) => [key, createDiagnosticValue(item, depth + 1)]));\n\t}\n\tif (typeof value === \"function\") return { type: \"function\" };\n\tif (typeof value === \"symbol\") return { type: \"symbol\" };\n\tif (typeof value === \"bigint\") return value.toString();\n\n\treturn { type: \"unknown\" };\n}\n\n/**\n * Описывает форму данных кеша без самих значений: типы, размеры массивов и ключи объектов.\n */\nexport function createDataShape(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null) return { type: \"null\" };\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (Array.isArray(value)) {\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tlength: value.length,\n\t\t\tfirstItemsShape: value.slice(0, 3).map((item) => createDataShape(item, depth + 1))\n\t\t};\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tkeys: entries.map(([key]) => key),\n\t\t\tshape: Object.fromEntries(entries.map(([key, item]) => [key, createDataShape(item, depth + 1)]))\n\t\t};\n\t}\n\n\treturn { type: typeof value };\n}\n\nexport function sanitizeDetail(detail: Record<string, unknown> | undefined): Record<string, ErrorReportSafeValue> | undefined {\n\tif (!detail) return undefined;\n\n\tconst entries = Object.entries(detail)\n\t\t.slice(0, MAX_OBJECT_KEYS)\n\t\t.map(([key, value]) => [key, createDiagnosticValue(value)] as const);\n\n\treturn entries.length ? Object.fromEntries(entries) : undefined;\n}\n","import { truncateText } from \"../formatters\";\n\nimport { sanitizeDetail } from \"./safeValue\";\n\nimport type { ErrorReportBreadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 80;\nconst MAX_ELEMENT_CHAIN = 20;\nconst MAX_TEXT_LENGTH = 80;\nconst MAX_ATTRIBUTE_LENGTH = 120;\nconst CLICK_TARGET_SELECTOR = [\n\t\"button\",\n\t\"a\",\n\t\"input\",\n\t\"select\",\n\t\"textarea\",\n\t\"[role]\",\n\t\"[aria-label]\",\n\t\"[title]\",\n\t\"[data-ui]\",\n\t\"[data-action]\"\n].join(\",\");\n\nlet breadcrumbs: ErrorReportBreadcrumb[] = [];\n\nfunction nowUtc() {\n\treturn new Date().toISOString();\n}\n\nexport function addErrorReportBreadcrumb(breadcrumb: Omit<ErrorReportBreadcrumb, \"utc\"> & { utc?: string }) {\n\tbreadcrumbs = [...breadcrumbs, { ...breadcrumb, utc: breadcrumb.utc ?? nowUtc() }].slice(-MAX_BREADCRUMBS);\n}\n\nexport function getErrorReportBreadcrumbs() {\n\treturn breadcrumbs;\n}\n\nexport function clearErrorReportBreadcrumbs() {\n\tbreadcrumbs = [];\n}\n\nfunction truncateAttributeText(value: string | null | undefined) {\n\treturn truncateText(value, MAX_ATTRIBUTE_LENGTH);\n}\n\nfunction readStableAttributes(element: Element) {\n\treturn {\n\t\tid: truncateAttributeText(element.id),\n\t\trole: truncateAttributeText(element.getAttribute(\"role\")),\n\t\ttype: truncateAttributeText(element.getAttribute(\"type\")),\n\t\ttitle: truncateAttributeText(element.getAttribute(\"title\")),\n\t\tariaLabel: truncateAttributeText(element.getAttribute(\"aria-label\")),\n\t\tdataUi: truncateAttributeText(element.getAttribute(\"data-ui\")),\n\t\tdataAction: truncateAttributeText(element.getAttribute(\"data-action\"))\n\t};\n}\n\nfunction readClickText(element: Element) {\n\tif (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n\t\treturn undefined;\n\t}\n\n\tif (!element.matches(\"button,a,[role],[aria-label],[title]\")) return undefined;\n\n\treturn truncateText(element.textContent, MAX_TEXT_LENGTH);\n}\n\nfunction escapeSelectorPart(value: string) {\n\tif (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n\t\treturn CSS.escape(value);\n\t}\n\n\treturn value.replace(/[\"\\\\#.[\\]>~+:]/g, \"\\\\$&\");\n}\n\nfunction buildElementSelector(element: Element) {\n\tconst attrs = readStableAttributes(element);\n\tconst parts = [element.tagName.toLowerCase()];\n\n\tif (attrs.id) parts.push(`#${escapeSelectorPart(attrs.id)}`);\n\tif (attrs.role) parts.push(`[role=\"${attrs.role}\"]`);\n\tif (attrs.type) parts.push(`[type=\"${attrs.type}\"]`);\n\tif (attrs.dataUi) parts.push(`[data-ui=\"${attrs.dataUi}\"]`);\n\tif (attrs.dataAction) parts.push(`[data-action=\"${attrs.dataAction}\"]`);\n\n\treturn parts.join(\"\");\n}\n\nfunction describeElement(element: Element) {\n\tconst attrs = readStableAttributes(element);\n\n\treturn {\n\t\ttag: element.tagName.toLowerCase(),\n\t\tselector: buildElementSelector(element),\n\t\ttext: readClickText(element),\n\t\t...attrs\n\t};\n}\n\nfunction compactElementDescription(description: ReturnType<typeof describeElement>) {\n\treturn Object.fromEntries(\n\t\tObject.entries(description).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n\t);\n}\n\nfunction getClickElementChain(target: Element) {\n\tconst chain: Element[] = [];\n\tlet current: Element | null = target;\n\n\twhile (current && current !== document.documentElement && chain.length < MAX_ELEMENT_CHAIN) {\n\t\tchain.push(current);\n\t\tif (current === document.body) break;\n\t\tcurrent = current.parentElement;\n\t}\n\n\treturn chain;\n}\n\nfunction findMeaningfulClickTarget(target: Element) {\n\treturn target.closest(CLICK_TARGET_SELECTOR) ?? target;\n}\n\nfunction describeClickTarget(target: EventTarget | null) {\n\tif (!(target instanceof Element)) return undefined;\n\n\tconst meaningfulTarget = findMeaningfulClickTarget(target);\n\tconst chain = getClickElementChain(meaningfulTarget);\n\n\treturn chain.map((element) => buildElementSelector(element)).join(\" > \");\n}\n\nfunction describeClickDetail(event: MouseEvent) {\n\tconst target = event.target instanceof Element ? event.target : undefined;\n\tconst meaningfulTarget = target ? findMeaningfulClickTarget(target) : undefined;\n\tconst chain = meaningfulTarget\n\t\t? getClickElementChain(meaningfulTarget).map((element) => compactElementDescription(describeElement(element)))\n\t\t: [];\n\n\treturn sanitizeDetail({\n\t\tbutton: event.button,\n\t\tctrlKey: event.ctrlKey,\n\t\tshiftKey: event.shiftKey,\n\t\taltKey: event.altKey,\n\t\tclientX: event.clientX,\n\t\tclientY: event.clientY,\n\t\ttarget: meaningfulTarget ? compactElementDescription(describeElement(meaningfulTarget)) : undefined,\n\t\tchain\n\t});\n}\n\n/**\n * Подключает breadcrumbs по действиям пользователя без тел запросов.\n */\nexport function installErrorReportBrowserBreadcrumbs() {\n\tif (typeof window === \"undefined\") return () => undefined;\n\n\tconst onClick = (event: MouseEvent) => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"click\",\n\t\t\ttarget: describeClickTarget(event.target),\n\t\t\tdetail: describeClickDetail(event)\n\t\t});\n\t};\n\n\tconst onVisibilityChange = () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"visibility\",\n\t\t\tdetail: sanitizeDetail({ visibilityState: document.visibilityState })\n\t\t});\n\t};\n\n\twindow.addEventListener(\"click\", onClick, true);\n\tdocument.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n\treturn () => {\n\t\twindow.removeEventListener(\"click\", onClick, true);\n\t\tdocument.removeEventListener(\"visibilitychange\", onVisibilityChange);\n\t};\n}\n","import { normalizeText } from \"../formatters\";\n\nimport type { ErrorReportErrorInfo } from \"./types\";\n\nfunction readStatus(value: Record<string, unknown>) {\n\tconst status = value.status ?? value.statusCode ?? value.httpStatus;\n\treturn typeof status === \"number\" && Number.isFinite(status) ? status : undefined;\n}\n\nfunction readServerFnTransportErrorInfo(error: unknown): ErrorReportErrorInfo | null {\n\tif (!error || typeof error !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst transport = error as Record<string, unknown>;\n\tconst appError = transport.appError;\n\tif (!appError || typeof appError !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst payload = appError as Record<string, unknown>;\n\tconst message = normalizeText(payload.message);\n\tif (!message) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tname: \"AppError\",\n\t\tmessage,\n\t\tcode: normalizeText(payload.code),\n\t\thttpStatus: readStatus(payload)\n\t};\n}\n\n/**\n * Нормализует любое брошенное значение в форму, удобную для поиска и сохранения.\n * Stacktrace намеренно сохраняется полностью: это основная диагностическая ценность отчета.\n */\nexport function createErrorInfo(error: unknown): ErrorReportErrorInfo {\n\tconst serverFnErrorInfo = readServerFnTransportErrorInfo(error);\n\tif (serverFnErrorInfo) {\n\t\treturn serverFnErrorInfo;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\tname: error.name || \"Error\",\n\t\t\tmessage: error.message,\n\t\t\tstackTrace: error.stack\n\t\t};\n\t}\n\n\tif (error && typeof error === \"object\") {\n\t\tconst record = error as Record<string, unknown>;\n\t\treturn {\n\t\t\tname: typeof record.name === \"string\" ? record.name : \"Error\",\n\t\t\tmessage: typeof record.message === \"string\" ? record.message : String(error),\n\t\t\tstackTrace: typeof record.stack === \"string\" ? record.stack : undefined,\n\t\t\thttpStatus: readStatus(record)\n\t\t};\n\t}\n\n\treturn {\n\t\tname: \"Error\",\n\t\tmessage: typeof error === \"string\" ? error : String(error ?? \"Неизвестная ошибка\")\n\t};\n}\n","import { type PersistedQuery } from \"@tanstack/query-persist-client-core\";\nimport { type MutationKey, type MutationState, type QueryClient, type QueryKey, type QueryState } from \"@tanstack/react-query\";\n\nimport { createIndexedDbQueryStorage } from \"../query-client\";\n\nimport { createErrorInfo } from \"./errorInfo\";\nimport { createDataShape, createDiagnosticValue, sanitizeDetail } from \"./safeValue\";\nimport {\n\ttype ErrorReportMutationDiagnostics,\n\ttype ErrorReportPersistedQueryDiagnostics,\n\ttype ErrorReportQueryDiagnostics,\n\ttype ErrorReportSafeValue\n} from \"./types\";\n\ntype QueryDiagnosticSource = {\n\tqueryHash: string;\n\tqueryKey: QueryKey;\n\tstate: QueryState<unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n\tgetObserversCount: () => number;\n};\n\ntype MutationDiagnosticSource = {\n\toptions: {\n\t\tmutationKey?: MutationKey;\n\t};\n\tstate: MutationState<unknown, unknown, unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n};\n\nconst MAX_QUERY_DIAGNOSTICS = 40;\nconst MAX_MUTATION_DIAGNOSTICS = 40;\nconst MAX_PERSISTED_QUERY_DIAGNOSTICS = 40;\n\nfunction sanitizeMeta(meta: Record<string, unknown> | undefined): Record<string, ErrorReportSafeValue> | undefined {\n\treturn sanitizeDetail(meta);\n}\n\nexport function collectQueryDiagnostics(query: QueryDiagnosticSource): ErrorReportQueryDiagnostics {\n\treturn {\n\t\tqueryHash: query.queryHash,\n\t\tqueryKey: createDiagnosticValue(query.queryKey),\n\t\tstatus: query.state.status,\n\t\tfetchStatus: query.state.fetchStatus,\n\t\tdataUpdatedAt: query.state.dataUpdatedAt,\n\t\terrorUpdatedAt: query.state.errorUpdatedAt,\n\t\tfailureCount: query.state.fetchFailureCount,\n\t\tisInvalidated: query.state.isInvalidated,\n\t\tobserversCount: query.getObserversCount(),\n\t\tmeta: sanitizeMeta(query.meta),\n\t\tdataShape: createDataShape(query.state.data),\n\t\terror: query.state.error ? createErrorInfo(query.state.error) : undefined\n\t};\n}\n\nexport function collectMutationDiagnostics(mutation: MutationDiagnosticSource): ErrorReportMutationDiagnostics {\n\treturn {\n\t\tmutationKey: mutation.options.mutationKey ? createDiagnosticValue(mutation.options.mutationKey) : undefined,\n\t\tstatus: mutation.state.status,\n\t\tfailureCount: mutation.state.failureCount,\n\t\tsubmittedAt: mutation.state.submittedAt,\n\t\tmeta: sanitizeMeta(mutation.meta),\n\t\terror: mutation.state.error ? createErrorInfo(mutation.state.error) : undefined\n\t};\n}\n\nexport function collectQueryClientDiagnostics(queryClient: QueryClient) {\n\treturn {\n\t\tqueries: queryClient.getQueryCache().getAll().slice(-MAX_QUERY_DIAGNOSTICS).map(collectQueryDiagnostics),\n\t\tmutations: queryClient.getMutationCache().getAll().slice(-MAX_MUTATION_DIAGNOSTICS).map(collectMutationDiagnostics)\n\t};\n}\n\nfunction collectPersistedStateDiagnostics(storageKey: string, persistedQuery: PersistedQuery): ErrorReportPersistedQueryDiagnostics {\n\tconst state = persistedQuery.state;\n\n\treturn {\n\t\tstorageKey,\n\t\tbuster: persistedQuery.buster,\n\t\tqueryHash: persistedQuery.queryHash,\n\t\tqueryKey: createDiagnosticValue(persistedQuery.queryKey),\n\t\tstatus: state.status,\n\t\tfetchStatus: state.fetchStatus,\n\t\tdataUpdatedAt: state.dataUpdatedAt,\n\t\terrorUpdatedAt: state.errorUpdatedAt,\n\t\tfailureCount: state.fetchFailureCount,\n\t\terror: state.error ? createErrorInfo(state.error) : undefined\n\t};\n}\n\n/**\n * Читает IndexedDB persistence и возвращает только технические поля.\n * `state.data` и другие значения кеша не попадают в результат.\n */\nexport async function collectPersistedQueryDiagnostics(): Promise<ErrorReportPersistedQueryDiagnostics[]> {\n\tconst storage = createIndexedDbQueryStorage<PersistedQuery>();\n\tif (!storage?.entries) return [];\n\n\ttry {\n\t\tconst entries = await storage.entries();\n\t\treturn entries\n\t\t\t.slice(-MAX_PERSISTED_QUERY_DIAGNOSTICS)\n\t\t\t.map(([storageKey, persistedQuery]) => collectPersistedStateDiagnostics(storageKey, persistedQuery));\n\t} catch {\n\t\treturn [];\n\t}\n}\n","type ErrorReportEnvironmentOptions = {\n\tisDev?: boolean;\n};\n\n/**\n * Отчеты собираются только в браузере и только вне dev-режима.\n * На серверном рендеринге draft не создается, чтобы не смешивать SSR-ошибки с клиентской диагностикой.\n */\nexport function isErrorReportingEnabled(options: ErrorReportEnvironmentOptions = {}) {\n\tconst isDev = options.isDev ?? __DEV__;\n\n\treturn typeof window !== \"undefined\" && !isDev;\n}\n\nexport function getErrorReportEnvironment() {\n\tconst mode: \"development\" | \"production\" = __DEV__ ? \"development\" : \"production\";\n\n\treturn {\n\t\tmode,\n\t\tbuildId: typeof __APP_BUILD_ID__ === \"string\" ? __APP_BUILD_ID__ : undefined\n\t};\n}\n\nexport function getErrorReportClientEnvironment() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tuserAgent: window.navigator.userAgent,\n\t\tlanguage: window.navigator.language,\n\t\ttimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n\t};\n}\n","import { uuidv4 } from \"../crypto\";\nimport { formatDateAsODataDatetime } from \"../formatters\";\nimport { getSessionStorageId } from \"../session-storage\";\n\nimport { getErrorReportBreadcrumbs } from \"./breadcrumbs\";\nimport { getErrorReportClientEnvironment, getErrorReportEnvironment, isErrorReportingEnabled } from \"./environment\";\n\nimport type { ErrorReportCategory, ErrorReportDraft, ErrorReportErrorInfo, ErrorReportPayload, ErrorReportSafeValue } from \"./types\";\n\nconst STORAGE_KEY = `${__APP_ID__}.errorReport.drafts.v1`;\nconst SESSION_STORAGE_KEY = `${__APP_ID__}.errorReport.sessionId.v1`;\nconst MAX_DRAFTS = 10;\n\nlet drafts = loadDrafts();\n\nfunction nowUtc() {\n\treturn formatDateAsODataDatetime(new Date());\n}\n\nfunction loadDrafts(): ErrorReportDraft[] {\n\tif (typeof sessionStorage === \"undefined\") return [];\n\n\ttry {\n\t\tconst raw = sessionStorage.getItem(STORAGE_KEY);\n\t\tconst parsed = raw ? JSON.parse(raw) : [];\n\t\treturn Array.isArray(parsed) ? (parsed as ErrorReportDraft[]) : [];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction saveDrafts(nextDrafts: ErrorReportDraft[]) {\n\tdrafts = nextDrafts.slice(-MAX_DRAFTS);\n\tif (typeof sessionStorage === \"undefined\") return;\n\n\ttry {\n\t\tsessionStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));\n\t} catch {\n\t\t// Переполнение sessionStorage не должно ломать пользовательский сценарий.\n\t}\n}\n\nfunction getLocationSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tpathname: window.location.pathname,\n\t\torigin: window.location.origin\n\t};\n}\n\nfunction getViewportSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight,\n\t\tdevicePixelRatio: window.devicePixelRatio\n\t};\n}\n\nexport function getErrorReportDraft(reportId: string) {\n\treturn drafts.find((draft) => draft.reportId === reportId);\n}\n\nexport function updateErrorReportDraft(reportId: string, patch: Partial<ErrorReportDraft>) {\n\tconst current = getErrorReportDraft(reportId);\n\tif (!current) return undefined;\n\n\tconst next = { ...current, ...patch };\n\tsaveDrafts(drafts.map((draft) => (draft.reportId === reportId ? next : draft)));\n\treturn next;\n}\n\nexport function getErrorReportDrafts() {\n\treturn drafts;\n}\n\nexport function captureErrorReportDraft(args: {\n\tcategory: ErrorReportCategory;\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tquery?: ErrorReportPayload[\"query\"];\n\tmutation?: ErrorReportPayload[\"mutation\"];\n\tqueryClient?: ErrorReportPayload[\"queryClient\"];\n\tpersistedQueries?: ErrorReportPayload[\"persistedQueries\"];\n\treact?: ErrorReportPayload[\"react\"];\n\tcontext?: Record<string, ErrorReportSafeValue>;\n}) {\n\tif (!isErrorReportingEnabled()) return undefined;\n\n\tconst reportId = uuidv4();\n\tconst sessionId = getSessionStorageId(SESSION_STORAGE_KEY);\n\tconst createdUtc = nowUtc();\n\tconst payload: ErrorReportPayload = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tsource: args.source,\n\t\terror: args.error,\n\t\tenvironment: getErrorReportEnvironment(),\n\t\tclient: getErrorReportClientEnvironment(),\n\t\tlocation: getLocationSnapshot(),\n\t\tviewport: getViewportSnapshot(),\n\t\treact: args.react,\n\t\tquery: args.query,\n\t\tmutation: args.mutation,\n\t\tqueryClient: args.queryClient,\n\t\tpersistedQueries: args.persistedQueries,\n\t\tbreadcrumbs: getErrorReportBreadcrumbs(),\n\t\tcontext: args.context\n\t};\n\tconst draft: ErrorReportDraft = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tstatus: \"pending\",\n\t\tpayload\n\t};\n\n\tsaveDrafts([...drafts, draft]);\n\treturn draft;\n}\n","export type ErrorReportTransportHtmlSummary = {\n\tlength: number;\n\ttitle?: string;\n\tformCount?: number;\n\tinputNames?: string[];\n\ttextPreview?: string;\n};\n\nexport type ErrorReportTransportErrorContext = {\n\tsource: \"fetch.parseResponse\" | \"fetch.buildHttpError\";\n\trequestUrl?: string;\n\tresponseUrl?: string;\n\tmethod?: string;\n\tbaseUrlType?: string;\n\tsapClient?: string | null;\n\tstatus?: number;\n\tstatusText?: string;\n\tcontentType?: string;\n\tredirected?: boolean;\n\tresponseType?: string;\n\thtml?: ErrorReportTransportHtmlSummary;\n};\n\nexport type ErrorReportTransportErrorReporter = (error: Error, context: ErrorReportTransportErrorContext) => void | Promise<void>;\n\nconst DEDUPLICATION_INTERVAL_MS = 60_000;\nconst MAX_RECENT_REPORT_KEYS = 100;\nconst TRANSPORT_REPORT_DELAY_MS = 250;\n\nlet transportErrorReporter: ErrorReportTransportErrorReporter | undefined;\nconst scheduledTransportErrors = new WeakSet<Error>();\nconst suppressedTransportErrors = new WeakSet<Error>();\nconst recentReportKeys = new Map<string, number>();\n\nfunction createReportKey(context: ErrorReportTransportErrorContext) {\n\treturn [context.source, context.method, context.status, context.requestUrl, context.responseUrl].filter(Boolean).join(\"|\");\n}\n\nfunction shouldSkipByRecentKey(context: ErrorReportTransportErrorContext) {\n\tconst now = Date.now();\n\tconst key = createReportKey(context);\n\n\tfor (const [recentKey, timestamp] of recentReportKeys) {\n\t\tif (now - timestamp > DEDUPLICATION_INTERVAL_MS || recentReportKeys.size > MAX_RECENT_REPORT_KEYS) {\n\t\t\trecentReportKeys.delete(recentKey);\n\t\t}\n\t}\n\n\tconst lastReportedAt = recentReportKeys.get(key);\n\tif (lastReportedAt && now - lastReportedAt < DEDUPLICATION_INTERVAL_MS) return true;\n\n\trecentReportKeys.set(key, now);\n\treturn false;\n}\n\n/**\n * Регистрирует приложение как получателя транспортных ошибок.\n * Сам OData transport не знает про QueryClient и UI, поэтому только публикует событие,\n * а app-слой решает, как именно создать и отправить отчет.\n */\nexport function setErrorReportTransportErrorReporter(reporter: ErrorReportTransportErrorReporter | undefined) {\n\ttransportErrorReporter = reporter;\n\trecentReportKeys.clear();\n}\n\nexport function isTransportErrorReportScheduled(error: unknown) {\n\treturn error instanceof Error && scheduledTransportErrors.has(error);\n}\n\nexport function suppressTransportErrorReport(error: unknown) {\n\tif (error instanceof Error) {\n\t\tsuppressedTransportErrors.add(error);\n\t}\n}\n\nexport function reportTransportError(error: Error, context: ErrorReportTransportErrorContext) {\n\tscheduledTransportErrors.add(error);\n\n\t// Даем React Query шанс перехватить эту же ошибку и создать query/mutation-отчет\n\t// с более полезным снимком кеша. Если такого перехвата нет, transport-отчет уйдет сам.\n\tsetTimeout(() => {\n\t\tif (suppressedTransportErrors.has(error)) return;\n\t\tif (!transportErrorReporter) return;\n\t\tif (shouldSkipByRecentKey(context)) return;\n\n\t\ttry {\n\t\t\tconst result = transportErrorReporter(error, context);\n\t\t\tvoid Promise.resolve(result).catch(() => undefined);\n\t\t} catch {\n\t\t\t// Ошибка диагностического hook не должна менять поведение исходного fetch.\n\t\t}\n\t}, TRANSPORT_REPORT_DELAY_MS);\n}\n","import { type Mutation, type Query, type QueryClient } from \"@tanstack/react-query\";\n\nimport { addErrorReportBreadcrumb } from \"./breadcrumbs\";\nimport {\n\tcollectMutationDiagnostics,\n\tcollectPersistedQueryDiagnostics,\n\tcollectQueryClientDiagnostics,\n\tcollectQueryDiagnostics\n} from \"./diagnostics\";\nimport { captureErrorReportDraft } from \"./drafts\";\nimport { createErrorInfo } from \"./errorInfo\";\nimport { sanitizeDetail } from \"./safeValue\";\nimport { suppressTransportErrorReport } from \"./transport\";\n\nimport type { ErrorReportMutationContext, ErrorReportQueryContext, ErrorReportRuntimeContext } from \"./types\";\n\nexport async function captureQueryErrorReport(\n\terror: unknown,\n\tquery: Query<unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext?: ErrorReportQueryContext\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context?.source ?? \"query\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"query-error\",\n\t\tdetail: sanitizeDetail({\n\t\t\tqueryHash: query.queryHash,\n\t\t\tqueryKey: context?.queryKey ?? query.queryKey,\n\t\t\t...context?.detail\n\t\t})\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"query\",\n\t\tsource,\n\t\terror: context?.errorInfo ?? createErrorInfo(error),\n\t\tquery: collectQueryDiagnostics(query),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context?.detail)\n\t});\n}\n\nexport async function captureMutationErrorReport(\n\terror: unknown,\n\tmutation: Mutation<unknown, unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext: ErrorReportMutationContext = {}\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context.source ?? \"mutation\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"mutation-error\",\n\t\tdetail: sanitizeDetail({ mutationKey: mutation.options.mutationKey, ...context.detail })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"mutation\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\tmutation: collectMutationDiagnostics(mutation),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries\n\t});\n}\n\nexport async function captureRuntimeErrorReport(error: unknown, context: ErrorReportRuntimeContext = {}, queryClient?: QueryClient) {\n\tconst source = context.source ?? context.category ?? \"runtime\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"runtime-error\",\n\t\tdetail: sanitizeDetail({ category: context.category ?? \"runtime\", source, ...context.detail })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = queryClient\n\t\t? await Promise.all([collectPersistedQueryDiagnostics(), Promise.resolve(collectQueryClientDiagnostics(queryClient))])\n\t\t: [undefined, undefined];\n\n\treturn captureErrorReportDraft({\n\t\tcategory: context.category ?? \"runtime\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\treact: context.componentStack ? { componentStack: context.componentStack } : undefined,\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context.detail)\n\t});\n}\n","import type { ErrorReportRuntimeContext } from \"./types\";\n\nexport type ErrorReportRuntimeErrorReporter = (error: unknown, context: ErrorReportRuntimeContext) => void | Promise<void>;\n\nlet runtimeErrorReporter: ErrorReportRuntimeErrorReporter | undefined;\n\n/**\n * Регистрирует app-слой как получателя ручных runtime-ошибок.\n * Shared-код может вызвать reportRuntimeError без знания о QueryClient, UI и режиме доставки.\n */\nexport function setErrorReportRuntimeErrorReporter(reporter: ErrorReportRuntimeErrorReporter | undefined) {\n\truntimeErrorReporter = reporter;\n}\n\n/**\n * Ручная отправка runtime-ошибки из try/catch или другого кода вне React-компонента.\n * Функция не бросает исключений: диагностический отчет не должен ломать основной сценарий.\n *\n * @example\n *\n * try {\n * // ...\n * } catch (error) {\n * reportRuntimeError(error, {\n * detail: {\n * source: \"s3-download\",\n * action: \"download-from-s3\"\n * }\n * });\n * }\n */\nexport async function reportRuntimeError(error: unknown, context: ErrorReportRuntimeContext = {}) {\n\tif (!runtimeErrorReporter) return;\n\n\ttry {\n\t\tawait runtimeErrorReporter(error, context);\n\t} catch {\n\t\t// Ошибка диагностического hook не должна менять поведение пользовательского кода.\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/error-report/safeValue.ts","../../src/error-report/breadcrumbs.ts","../../src/error-report/errorInfo.ts","../../src/error-report/diagnostics.ts","../../src/error-report/environment.ts","../../src/error-report/drafts.ts","../../src/error-report/transport.ts","../../src/error-report/capture.ts","../../src/error-report/runtime.ts"],"sourcesContent":["import type { ErrorReportSafeValue } from \"./types\";\n\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\nconst MAX_OBJECT_KEYS = 40;\n\n/**\n * Превращает произвольное значение в JSON-совместимую диагностическую форму.\n * Значения сохраняются читаемыми, потому что queryKey/meta/context нужны\n * для восстановления пользовательского сценария; тяжелые данные query cache\n * отсекаются отдельно и сюда не передаются.\n */\nexport function createDiagnosticValue(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null || typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\treturn value;\n\t}\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (value instanceof Date) return value.toISOString();\n\tif (Array.isArray(value)) {\n\t\treturn value.slice(0, MAX_ARRAY_ITEMS).map((item) => createDiagnosticValue(item, depth + 1));\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn Object.fromEntries(entries.map(([key, item]) => [key, createDiagnosticValue(item, depth + 1)]));\n\t}\n\tif (typeof value === \"function\") return { type: \"function\" };\n\tif (typeof value === \"symbol\") return { type: \"symbol\" };\n\tif (typeof value === \"bigint\") return value.toString();\n\n\treturn { type: \"unknown\" };\n}\n\n/**\n * Описывает форму данных кеша без самих значений: типы, размеры массивов и ключи объектов.\n */\nexport function createDataShape(value: unknown, depth = 0): ErrorReportSafeValue {\n\tif (depth >= MAX_DEPTH) return { type: \"truncated\" };\n\tif (value === null) return { type: \"null\" };\n\tif (value === undefined) return { type: \"undefined\" };\n\tif (Array.isArray(value)) {\n\t\treturn {\n\t\t\ttype: \"array\",\n\t\t\tlength: value.length,\n\t\t\tfirstItemsShape: value.slice(0, 3).map((item) => createDataShape(item, depth + 1))\n\t\t};\n\t}\n\tif (typeof value === \"object\") {\n\t\tconst entries = Object.entries(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n\n\t\treturn {\n\t\t\ttype: \"object\",\n\t\t\tkeys: entries.map(([key]) => key),\n\t\t\tshape: Object.fromEntries(entries.map(([key, item]) => [key, createDataShape(item, depth + 1)]))\n\t\t};\n\t}\n\n\treturn { type: typeof value };\n}\n\nexport function sanitizeDetail(detail: Record<string, unknown> | undefined): Record<string, ErrorReportSafeValue> | undefined {\n\tif (!detail) return undefined;\n\n\tconst entries = Object.entries(detail)\n\t\t.slice(0, MAX_OBJECT_KEYS)\n\t\t.map(([key, value]) => [key, createDiagnosticValue(value)] as const);\n\n\treturn entries.length ? Object.fromEntries(entries) : undefined;\n}\n","import { truncateText } from \"../formatters\";\n\nimport { sanitizeDetail } from \"./safeValue\";\n\nimport type { ErrorReportBreadcrumb } from \"./types\";\n\nconst MAX_BREADCRUMBS = 80;\nconst MAX_ELEMENT_CHAIN = 20;\nconst MAX_TEXT_LENGTH = 80;\nconst MAX_ATTRIBUTE_LENGTH = 120;\nconst CLICK_TARGET_SELECTOR = [\n\t\"button\",\n\t\"a\",\n\t\"input\",\n\t\"select\",\n\t\"textarea\",\n\t\"[role]\",\n\t\"[aria-label]\",\n\t\"[title]\",\n\t\"[data-ui]\",\n\t\"[data-action]\"\n].join(\",\");\n\nlet breadcrumbs: ErrorReportBreadcrumb[] = [];\n\nfunction nowUtc() {\n\treturn new Date().toISOString();\n}\n\nexport function addErrorReportBreadcrumb(breadcrumb: Omit<ErrorReportBreadcrumb, \"utc\"> & { utc?: string }) {\n\tbreadcrumbs = [...breadcrumbs, { ...breadcrumb, utc: breadcrumb.utc ?? nowUtc() }].slice(-MAX_BREADCRUMBS);\n}\n\nexport function getErrorReportBreadcrumbs() {\n\treturn breadcrumbs;\n}\n\nexport function clearErrorReportBreadcrumbs() {\n\tbreadcrumbs = [];\n}\n\nfunction truncateAttributeText(value: string | null | undefined) {\n\treturn truncateText(value, MAX_ATTRIBUTE_LENGTH);\n}\n\nfunction readStableAttributes(element: Element) {\n\treturn {\n\t\tid: truncateAttributeText(element.id),\n\t\trole: truncateAttributeText(element.getAttribute(\"role\")),\n\t\ttype: truncateAttributeText(element.getAttribute(\"type\")),\n\t\ttitle: truncateAttributeText(element.getAttribute(\"title\")),\n\t\tariaLabel: truncateAttributeText(element.getAttribute(\"aria-label\")),\n\t\tdataUi: truncateAttributeText(element.getAttribute(\"data-ui\")),\n\t\tdataAction: truncateAttributeText(element.getAttribute(\"data-action\"))\n\t};\n}\n\nfunction readClickText(element: Element) {\n\tif (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n\t\treturn undefined;\n\t}\n\n\tif (!element.matches(\"button,a,[role],[aria-label],[title]\")) return undefined;\n\n\treturn truncateText(element.textContent, MAX_TEXT_LENGTH);\n}\n\nfunction escapeSelectorPart(value: string) {\n\tif (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n\t\treturn CSS.escape(value);\n\t}\n\n\treturn value.replace(/[\"\\\\#.[\\]>~+:]/g, \"\\\\$&\");\n}\n\nfunction buildElementSelector(element: Element) {\n\tconst attrs = readStableAttributes(element);\n\tconst parts = [element.tagName.toLowerCase()];\n\n\tif (attrs.id) parts.push(`#${escapeSelectorPart(attrs.id)}`);\n\tif (attrs.role) parts.push(`[role=\"${attrs.role}\"]`);\n\tif (attrs.type) parts.push(`[type=\"${attrs.type}\"]`);\n\tif (attrs.dataUi) parts.push(`[data-ui=\"${attrs.dataUi}\"]`);\n\tif (attrs.dataAction) parts.push(`[data-action=\"${attrs.dataAction}\"]`);\n\n\treturn parts.join(\"\");\n}\n\nfunction describeElement(element: Element) {\n\tconst attrs = readStableAttributes(element);\n\n\treturn {\n\t\ttag: element.tagName.toLowerCase(),\n\t\tselector: buildElementSelector(element),\n\t\ttext: readClickText(element),\n\t\t...attrs\n\t};\n}\n\nfunction compactElementDescription(description: ReturnType<typeof describeElement>) {\n\treturn Object.fromEntries(\n\t\tObject.entries(description).filter(([, value]) => value !== undefined && (!Array.isArray(value) || value.length > 0))\n\t);\n}\n\nfunction getClickElementChain(target: Element) {\n\tconst chain: Element[] = [];\n\tlet current: Element | null = target;\n\n\twhile (current && current !== document.documentElement && chain.length < MAX_ELEMENT_CHAIN) {\n\t\tchain.push(current);\n\t\tif (current === document.body) break;\n\t\tcurrent = current.parentElement;\n\t}\n\n\treturn chain;\n}\n\nfunction findMeaningfulClickTarget(target: Element) {\n\treturn target.closest(CLICK_TARGET_SELECTOR) ?? target;\n}\n\nfunction describeClickTarget(target: EventTarget | null) {\n\tif (!(target instanceof Element)) return undefined;\n\n\tconst meaningfulTarget = findMeaningfulClickTarget(target);\n\tconst chain = getClickElementChain(meaningfulTarget);\n\n\treturn chain.map((element) => buildElementSelector(element)).join(\" > \");\n}\n\nfunction describeClickDetail(event: MouseEvent) {\n\tconst target = event.target instanceof Element ? event.target : undefined;\n\tconst meaningfulTarget = target ? findMeaningfulClickTarget(target) : undefined;\n\tconst chain = meaningfulTarget\n\t\t? getClickElementChain(meaningfulTarget).map((element) => compactElementDescription(describeElement(element)))\n\t\t: [];\n\n\treturn sanitizeDetail({\n\t\tbutton: event.button,\n\t\tctrlKey: event.ctrlKey,\n\t\tshiftKey: event.shiftKey,\n\t\taltKey: event.altKey,\n\t\tclientX: event.clientX,\n\t\tclientY: event.clientY,\n\t\ttarget: meaningfulTarget ? compactElementDescription(describeElement(meaningfulTarget)) : undefined,\n\t\tchain\n\t});\n}\n\n/**\n * Подключает breadcrumbs по действиям пользователя без тел запросов.\n */\nexport function installErrorReportBrowserBreadcrumbs() {\n\tif (typeof window === \"undefined\") return () => undefined;\n\n\tconst onClick = (event: MouseEvent) => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"click\",\n\t\t\ttarget: describeClickTarget(event.target),\n\t\t\tdetail: describeClickDetail(event)\n\t\t});\n\t};\n\n\tconst onVisibilityChange = () => {\n\t\taddErrorReportBreadcrumb({\n\t\t\ttype: \"visibility\",\n\t\t\tdetail: sanitizeDetail({ visibilityState: document.visibilityState })\n\t\t});\n\t};\n\n\twindow.addEventListener(\"click\", onClick, true);\n\tdocument.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n\treturn () => {\n\t\twindow.removeEventListener(\"click\", onClick, true);\n\t\tdocument.removeEventListener(\"visibilitychange\", onVisibilityChange);\n\t};\n}\n","import { normalizeText } from \"../formatters\";\n\nimport type { ErrorReportErrorInfo } from \"./types\";\n\nconst DEFAULT_ERROR_MESSAGE = \"Неизвестная ошибка\";\n\n/**\n * Гарантирует непустое диагностическое сообщение, сохраняя исходный текст ошибки.\n * Fallback нужен для Error без message и для брошенных пустых строк.\n */\nfunction resolveErrorMessage(message: string) {\n\treturn normalizeText(message) ? message : DEFAULT_ERROR_MESSAGE;\n}\n\nfunction readStatus(value: Record<string, unknown>) {\n\tconst status = value.status ?? value.statusCode ?? value.httpStatus;\n\treturn typeof status === \"number\" && Number.isFinite(status) ? status : undefined;\n}\n\nfunction readServerFnTransportErrorInfo(error: unknown): ErrorReportErrorInfo | null {\n\tif (!error || typeof error !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst transport = error as Record<string, unknown>;\n\tconst appError = transport.appError;\n\tif (!appError || typeof appError !== \"object\") {\n\t\treturn null;\n\t}\n\n\tconst payload = appError as Record<string, unknown>;\n\tconst message = normalizeText(payload.message);\n\tif (!message) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tname: \"AppError\",\n\t\tmessage,\n\t\tcode: normalizeText(payload.code),\n\t\thttpStatus: readStatus(payload)\n\t};\n}\n\n/**\n * Нормализует любое брошенное значение в форму, удобную для поиска и сохранения.\n * Stacktrace намеренно сохраняется полностью: это основная диагностическая ценность отчета.\n */\nexport function createErrorInfo(error: unknown): ErrorReportErrorInfo {\n\tconst serverFnErrorInfo = readServerFnTransportErrorInfo(error);\n\tif (serverFnErrorInfo) {\n\t\treturn serverFnErrorInfo;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn {\n\t\t\tname: error.name || \"Error\",\n\t\t\tmessage: resolveErrorMessage(error.message),\n\t\t\tstackTrace: error.stack\n\t\t};\n\t}\n\n\tif (error && typeof error === \"object\") {\n\t\tconst record = error as Record<string, unknown>;\n\t\treturn {\n\t\t\tname: typeof record.name === \"string\" ? record.name : \"Error\",\n\t\t\tmessage: resolveErrorMessage(typeof record.message === \"string\" ? record.message : String(error)),\n\t\t\tstackTrace: typeof record.stack === \"string\" ? record.stack : undefined,\n\t\t\thttpStatus: readStatus(record)\n\t\t};\n\t}\n\n\treturn {\n\t\tname: \"Error\",\n\t\tmessage: resolveErrorMessage(typeof error === \"string\" ? error : String(error ?? DEFAULT_ERROR_MESSAGE))\n\t};\n}\n","import { type PersistedQuery } from \"@tanstack/query-persist-client-core\";\nimport { type MutationKey, type MutationState, type QueryClient, type QueryKey, type QueryState } from \"@tanstack/react-query\";\n\nimport { createIndexedDbQueryStorage } from \"../query-client\";\n\nimport { createErrorInfo } from \"./errorInfo\";\nimport { createDataShape, createDiagnosticValue, sanitizeDetail } from \"./safeValue\";\nimport {\n\ttype ErrorReportMutationDiagnostics,\n\ttype ErrorReportPersistedQueryDiagnostics,\n\ttype ErrorReportQueryDiagnostics,\n\ttype ErrorReportSafeValue\n} from \"./types\";\n\ntype QueryDiagnosticSource = {\n\tqueryHash: string;\n\tqueryKey: QueryKey;\n\tstate: QueryState<unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n\tgetObserversCount: () => number;\n};\n\ntype MutationDiagnosticSource = {\n\toptions: {\n\t\tmutationKey?: MutationKey;\n\t};\n\tstate: MutationState<unknown, unknown, unknown, unknown>;\n\tmeta?: Record<string, unknown>;\n};\n\nconst MAX_QUERY_DIAGNOSTICS = 40;\nconst MAX_MUTATION_DIAGNOSTICS = 40;\nconst MAX_PERSISTED_QUERY_DIAGNOSTICS = 40;\n\nfunction sanitizeMeta(meta: Record<string, unknown> | undefined): Record<string, ErrorReportSafeValue> | undefined {\n\treturn sanitizeDetail(meta);\n}\n\nexport function collectQueryDiagnostics(query: QueryDiagnosticSource): ErrorReportQueryDiagnostics {\n\treturn {\n\t\tqueryHash: query.queryHash,\n\t\tqueryKey: createDiagnosticValue(query.queryKey),\n\t\tstatus: query.state.status,\n\t\tfetchStatus: query.state.fetchStatus,\n\t\tdataUpdatedAt: query.state.dataUpdatedAt,\n\t\terrorUpdatedAt: query.state.errorUpdatedAt,\n\t\tfailureCount: query.state.fetchFailureCount,\n\t\tisInvalidated: query.state.isInvalidated,\n\t\tobserversCount: query.getObserversCount(),\n\t\tmeta: sanitizeMeta(query.meta),\n\t\tdataShape: createDataShape(query.state.data),\n\t\terror: query.state.error ? createErrorInfo(query.state.error) : undefined\n\t};\n}\n\nexport function collectMutationDiagnostics(mutation: MutationDiagnosticSource): ErrorReportMutationDiagnostics {\n\treturn {\n\t\tmutationKey: mutation.options.mutationKey ? createDiagnosticValue(mutation.options.mutationKey) : undefined,\n\t\tstatus: mutation.state.status,\n\t\tfailureCount: mutation.state.failureCount,\n\t\tsubmittedAt: mutation.state.submittedAt,\n\t\tmeta: sanitizeMeta(mutation.meta),\n\t\terror: mutation.state.error ? createErrorInfo(mutation.state.error) : undefined\n\t};\n}\n\nexport function collectQueryClientDiagnostics(queryClient: QueryClient) {\n\treturn {\n\t\tqueries: queryClient.getQueryCache().getAll().slice(-MAX_QUERY_DIAGNOSTICS).map(collectQueryDiagnostics),\n\t\tmutations: queryClient.getMutationCache().getAll().slice(-MAX_MUTATION_DIAGNOSTICS).map(collectMutationDiagnostics)\n\t};\n}\n\nfunction collectPersistedStateDiagnostics(storageKey: string, persistedQuery: PersistedQuery): ErrorReportPersistedQueryDiagnostics {\n\tconst state = persistedQuery.state;\n\n\treturn {\n\t\tstorageKey,\n\t\tbuster: persistedQuery.buster,\n\t\tqueryHash: persistedQuery.queryHash,\n\t\tqueryKey: createDiagnosticValue(persistedQuery.queryKey),\n\t\tstatus: state.status,\n\t\tfetchStatus: state.fetchStatus,\n\t\tdataUpdatedAt: state.dataUpdatedAt,\n\t\terrorUpdatedAt: state.errorUpdatedAt,\n\t\tfailureCount: state.fetchFailureCount,\n\t\terror: state.error ? createErrorInfo(state.error) : undefined\n\t};\n}\n\n/**\n * Читает IndexedDB persistence и возвращает только технические поля.\n * `state.data` и другие значения кеша не попадают в результат.\n */\nexport async function collectPersistedQueryDiagnostics(): Promise<ErrorReportPersistedQueryDiagnostics[]> {\n\tconst storage = createIndexedDbQueryStorage<PersistedQuery>();\n\tif (!storage?.entries) return [];\n\n\ttry {\n\t\tconst entries = await storage.entries();\n\t\treturn entries\n\t\t\t.slice(-MAX_PERSISTED_QUERY_DIAGNOSTICS)\n\t\t\t.map(([storageKey, persistedQuery]) => collectPersistedStateDiagnostics(storageKey, persistedQuery));\n\t} catch {\n\t\treturn [];\n\t}\n}\n","type ErrorReportEnvironmentOptions = {\n\tisDev?: boolean;\n};\n\n/**\n * Отчеты собираются только в браузере и только вне dev-режима.\n * На серверном рендеринге draft не создается, чтобы не смешивать SSR-ошибки с клиентской диагностикой.\n */\nexport function isErrorReportingEnabled(options: ErrorReportEnvironmentOptions = {}) {\n\tconst isDev = options.isDev ?? __DEV__;\n\n\treturn typeof window !== \"undefined\" && !isDev;\n}\n\nexport function getErrorReportEnvironment() {\n\tconst mode: \"development\" | \"production\" = __DEV__ ? \"development\" : \"production\";\n\n\treturn {\n\t\tmode,\n\t\tbuildId: typeof __APP_BUILD_ID__ === \"string\" ? __APP_BUILD_ID__ : undefined\n\t};\n}\n\nexport function getErrorReportClientEnvironment() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tuserAgent: window.navigator.userAgent,\n\t\tlanguage: window.navigator.language,\n\t\ttimeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n\t};\n}\n","import { uuidv4 } from \"../crypto\";\nimport { formatDateAsODataDatetime } from \"../formatters\";\nimport { getSessionStorageId } from \"../session-storage\";\n\nimport { getErrorReportBreadcrumbs } from \"./breadcrumbs\";\nimport { getErrorReportClientEnvironment, getErrorReportEnvironment, isErrorReportingEnabled } from \"./environment\";\n\nimport type { ErrorReportCategory, ErrorReportDraft, ErrorReportErrorInfo, ErrorReportPayload, ErrorReportSafeValue } from \"./types\";\n\nconst STORAGE_KEY = `${__APP_ID__}.errorReport.drafts.v1`;\nconst SESSION_STORAGE_KEY = `${__APP_ID__}.errorReport.sessionId.v1`;\nconst MAX_DRAFTS = 10;\n\nlet drafts = loadDrafts();\n\nfunction nowUtc() {\n\treturn formatDateAsODataDatetime(new Date());\n}\n\nfunction loadDrafts(): ErrorReportDraft[] {\n\tif (typeof sessionStorage === \"undefined\") return [];\n\n\ttry {\n\t\tconst raw = sessionStorage.getItem(STORAGE_KEY);\n\t\tconst parsed = raw ? JSON.parse(raw) : [];\n\t\treturn Array.isArray(parsed) ? (parsed as ErrorReportDraft[]) : [];\n\t} catch {\n\t\treturn [];\n\t}\n}\n\nfunction saveDrafts(nextDrafts: ErrorReportDraft[]) {\n\tdrafts = nextDrafts.slice(-MAX_DRAFTS);\n\tif (typeof sessionStorage === \"undefined\") return;\n\n\ttry {\n\t\tsessionStorage.setItem(STORAGE_KEY, JSON.stringify(drafts));\n\t} catch {\n\t\t// Переполнение sessionStorage не должно ломать пользовательский сценарий.\n\t}\n}\n\nfunction getLocationSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\tpathname: window.location.pathname,\n\t\torigin: window.location.origin\n\t};\n}\n\nfunction getViewportSnapshot() {\n\tif (typeof window === \"undefined\") return undefined;\n\n\treturn {\n\t\twidth: window.innerWidth,\n\t\theight: window.innerHeight,\n\t\tdevicePixelRatio: window.devicePixelRatio\n\t};\n}\n\nexport function getErrorReportDraft(reportId: string) {\n\treturn drafts.find((draft) => draft.reportId === reportId);\n}\n\nexport function updateErrorReportDraft(reportId: string, patch: Partial<ErrorReportDraft>) {\n\tconst current = getErrorReportDraft(reportId);\n\tif (!current) return undefined;\n\n\tconst next = { ...current, ...patch };\n\tsaveDrafts(drafts.map((draft) => (draft.reportId === reportId ? next : draft)));\n\treturn next;\n}\n\nexport function getErrorReportDrafts() {\n\treturn drafts;\n}\n\nexport function captureErrorReportDraft(args: {\n\tcategory: ErrorReportCategory;\n\tsource: string;\n\terror: ErrorReportErrorInfo;\n\tquery?: ErrorReportPayload[\"query\"];\n\tmutation?: ErrorReportPayload[\"mutation\"];\n\tqueryClient?: ErrorReportPayload[\"queryClient\"];\n\tpersistedQueries?: ErrorReportPayload[\"persistedQueries\"];\n\treact?: ErrorReportPayload[\"react\"];\n\tcontext?: Record<string, ErrorReportSafeValue>;\n}) {\n\tif (!isErrorReportingEnabled()) return undefined;\n\n\tconst reportId = uuidv4();\n\tconst sessionId = getSessionStorageId(SESSION_STORAGE_KEY);\n\tconst createdUtc = nowUtc();\n\tconst payload: ErrorReportPayload = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tsource: args.source,\n\t\terror: args.error,\n\t\tenvironment: getErrorReportEnvironment(),\n\t\tclient: getErrorReportClientEnvironment(),\n\t\tlocation: getLocationSnapshot(),\n\t\tviewport: getViewportSnapshot(),\n\t\treact: args.react,\n\t\tquery: args.query,\n\t\tmutation: args.mutation,\n\t\tqueryClient: args.queryClient,\n\t\tpersistedQueries: args.persistedQueries,\n\t\tbreadcrumbs: getErrorReportBreadcrumbs(),\n\t\tcontext: args.context\n\t};\n\tconst draft: ErrorReportDraft = {\n\t\treportId,\n\t\tsessionId,\n\t\tcreatedUtc,\n\t\tcategory: args.category,\n\t\tstatus: \"pending\",\n\t\tpayload\n\t};\n\n\tsaveDrafts([...drafts, draft]);\n\treturn draft;\n}\n","export type ErrorReportTransportHtmlSummary = {\n\tlength: number;\n\ttitle?: string;\n\tformCount?: number;\n\tinputNames?: string[];\n\ttextPreview?: string;\n};\n\nexport type ErrorReportTransportErrorContext = {\n\tsource: \"fetch.parseResponse\" | \"fetch.buildHttpError\";\n\trequestUrl?: string;\n\tresponseUrl?: string;\n\tmethod?: string;\n\tbaseUrlType?: string;\n\tsapClient?: string | null;\n\tstatus?: number;\n\tstatusText?: string;\n\tcontentType?: string;\n\tredirected?: boolean;\n\tresponseType?: string;\n\thtml?: ErrorReportTransportHtmlSummary;\n};\n\nexport type ErrorReportTransportErrorReporter = (error: Error, context: ErrorReportTransportErrorContext) => void | Promise<void>;\n\nconst DEDUPLICATION_INTERVAL_MS = 60_000;\nconst MAX_RECENT_REPORT_KEYS = 100;\nconst TRANSPORT_REPORT_DELAY_MS = 250;\n\nlet transportErrorReporter: ErrorReportTransportErrorReporter | undefined;\nconst scheduledTransportErrors = new WeakSet<Error>();\nconst suppressedTransportErrors = new WeakSet<Error>();\nconst recentReportKeys = new Map<string, number>();\n\nfunction createReportKey(context: ErrorReportTransportErrorContext) {\n\treturn [context.source, context.method, context.status, context.requestUrl, context.responseUrl].filter(Boolean).join(\"|\");\n}\n\nfunction shouldSkipByRecentKey(context: ErrorReportTransportErrorContext) {\n\tconst now = Date.now();\n\tconst key = createReportKey(context);\n\n\tfor (const [recentKey, timestamp] of recentReportKeys) {\n\t\tif (now - timestamp > DEDUPLICATION_INTERVAL_MS || recentReportKeys.size > MAX_RECENT_REPORT_KEYS) {\n\t\t\trecentReportKeys.delete(recentKey);\n\t\t}\n\t}\n\n\tconst lastReportedAt = recentReportKeys.get(key);\n\tif (lastReportedAt && now - lastReportedAt < DEDUPLICATION_INTERVAL_MS) return true;\n\n\trecentReportKeys.set(key, now);\n\treturn false;\n}\n\n/**\n * Регистрирует приложение как получателя транспортных ошибок.\n * Сам OData transport не знает про QueryClient и UI, поэтому только публикует событие,\n * а app-слой решает, как именно создать и отправить отчет.\n */\nexport function setErrorReportTransportErrorReporter(reporter: ErrorReportTransportErrorReporter | undefined) {\n\ttransportErrorReporter = reporter;\n\trecentReportKeys.clear();\n}\n\nexport function isTransportErrorReportScheduled(error: unknown) {\n\treturn error instanceof Error && scheduledTransportErrors.has(error);\n}\n\nexport function suppressTransportErrorReport(error: unknown) {\n\tif (error instanceof Error) {\n\t\tsuppressedTransportErrors.add(error);\n\t}\n}\n\nexport function reportTransportError(error: Error, context: ErrorReportTransportErrorContext) {\n\tscheduledTransportErrors.add(error);\n\n\t// Даем React Query шанс перехватить эту же ошибку и создать query/mutation-отчет\n\t// с более полезным снимком кеша. Если такого перехвата нет, transport-отчет уйдет сам.\n\tsetTimeout(() => {\n\t\tif (suppressedTransportErrors.has(error)) return;\n\t\tif (!transportErrorReporter) return;\n\t\tif (shouldSkipByRecentKey(context)) return;\n\n\t\ttry {\n\t\t\tconst result = transportErrorReporter(error, context);\n\t\t\tvoid Promise.resolve(result).catch(() => undefined);\n\t\t} catch {\n\t\t\t// Ошибка диагностического hook не должна менять поведение исходного fetch.\n\t\t}\n\t}, TRANSPORT_REPORT_DELAY_MS);\n}\n","import { type Mutation, type Query, type QueryClient } from \"@tanstack/react-query\";\n\nimport { addErrorReportBreadcrumb } from \"./breadcrumbs\";\nimport {\n\tcollectMutationDiagnostics,\n\tcollectPersistedQueryDiagnostics,\n\tcollectQueryClientDiagnostics,\n\tcollectQueryDiagnostics\n} from \"./diagnostics\";\nimport { captureErrorReportDraft } from \"./drafts\";\nimport { createErrorInfo } from \"./errorInfo\";\nimport { sanitizeDetail } from \"./safeValue\";\nimport { suppressTransportErrorReport } from \"./transport\";\n\nimport type { ErrorReportMutationContext, ErrorReportQueryContext, ErrorReportRuntimeContext } from \"./types\";\n\nexport async function captureQueryErrorReport(\n\terror: unknown,\n\tquery: Query<unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext?: ErrorReportQueryContext\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context?.source ?? \"query\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"query-error\",\n\t\tdetail: sanitizeDetail({\n\t\t\tqueryHash: query.queryHash,\n\t\t\tqueryKey: context?.queryKey ?? query.queryKey,\n\t\t\t...context?.detail\n\t\t})\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"query\",\n\t\tsource,\n\t\terror: context?.errorInfo ?? createErrorInfo(error),\n\t\tquery: collectQueryDiagnostics(query),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context?.detail)\n\t});\n}\n\nexport async function captureMutationErrorReport(\n\terror: unknown,\n\tmutation: Mutation<unknown, unknown, unknown, unknown>,\n\tqueryClient: QueryClient,\n\tcontext: ErrorReportMutationContext = {}\n) {\n\tsuppressTransportErrorReport(error);\n\tconst source = context.source ?? \"mutation\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"mutation-error\",\n\t\tdetail: sanitizeDetail({ mutationKey: mutation.options.mutationKey, ...context.detail })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = await Promise.all([\n\t\tcollectPersistedQueryDiagnostics(),\n\t\tPromise.resolve(collectQueryClientDiagnostics(queryClient))\n\t]);\n\n\treturn captureErrorReportDraft({\n\t\tcategory: \"mutation\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\tmutation: collectMutationDiagnostics(mutation),\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries\n\t});\n}\n\nexport async function captureRuntimeErrorReport(error: unknown, context: ErrorReportRuntimeContext = {}, queryClient?: QueryClient) {\n\tconst source = context.source ?? context.category ?? \"runtime\";\n\n\taddErrorReportBreadcrumb({\n\t\ttype: \"runtime-error\",\n\t\tdetail: sanitizeDetail({ category: context.category ?? \"runtime\", source, ...context.detail })\n\t});\n\n\tconst [persistedQueries, queryClientDiagnostics] = queryClient\n\t\t? await Promise.all([collectPersistedQueryDiagnostics(), Promise.resolve(collectQueryClientDiagnostics(queryClient))])\n\t\t: [undefined, undefined];\n\n\treturn captureErrorReportDraft({\n\t\tcategory: context.category ?? \"runtime\",\n\t\tsource,\n\t\terror: context.errorInfo ?? createErrorInfo(error),\n\t\treact: context.componentStack ? { componentStack: context.componentStack } : undefined,\n\t\tqueryClient: queryClientDiagnostics,\n\t\tpersistedQueries,\n\t\tcontext: sanitizeDetail(context.detail)\n\t});\n}\n","import type { ErrorReportRuntimeContext } from \"./types\";\n\nexport type ErrorReportRuntimeErrorReporter = (error: unknown, context: ErrorReportRuntimeContext) => void | Promise<void>;\n\nlet runtimeErrorReporter: ErrorReportRuntimeErrorReporter | undefined;\n\n/**\n * Регистрирует app-слой как получателя ручных runtime-ошибок.\n * Shared-код может вызвать reportRuntimeError без знания о QueryClient, UI и режиме доставки.\n */\nexport function setErrorReportRuntimeErrorReporter(reporter: ErrorReportRuntimeErrorReporter | undefined) {\n\truntimeErrorReporter = reporter;\n}\n\n/**\n * Ручная отправка runtime-ошибки из try/catch или другого кода вне React-компонента.\n * Функция не бросает исключений: диагностический отчет не должен ломать основной сценарий.\n *\n * @example\n *\n * try {\n * // ...\n * } catch (error) {\n * reportRuntimeError(error, {\n * detail: {\n * source: \"s3-download\",\n * action: \"download-from-s3\"\n * }\n * });\n * }\n */\nexport async function reportRuntimeError(error: unknown, context: ErrorReportRuntimeContext = {}) {\n\tif (!runtimeErrorReporter) return;\n\n\ttry {\n\t\tawait runtimeErrorReporter(error, context);\n\t} catch {\n\t\t// Ошибка диагностического hook не должна менять поведение пользовательского кода.\n\t}\n}\n"],"mappings":"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"}
|