reportli 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export declare const Reportli: {
6
6
  init(cfg: Config): void;
7
7
  capture(error: unknown): void;
8
8
  captureMessage(message: string): void;
9
+ errorHandler(): (err: any, _req: any, _res: any, next: any) => void;
9
10
  };
10
- export {};
11
+ export default Reportli;
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,KAAK,MAAM,GAAG;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAiDF,eAAO,MAAM,QAAQ;cACT,MAAM;mBAmGD,OAAO;4BAeE,MAAM;CAO/B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,KAAK,MAAM,GAAG;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AA+WF,eAAO,MAAM,QAAQ;cACT,MAAM;mBAyBD,OAAO;4BAQE,MAAM;qBAMX,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CAK7D,CAAC;AAEF,eAAe,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -20,142 +20,336 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
- Reportli: () => Reportli
23
+ Reportli: () => Reportli,
24
+ default: () => src_default
24
25
  });
25
26
  module.exports = __toCommonJS(src_exports);
26
27
  var ENDPOINT = "https://fahikyfmgdyzejdfftox.supabase.co/functions/v1/rapid-processor";
27
28
  var initialized = false;
28
- var config;
29
- function post(payload) {
30
- fetch(ENDPOINT, {
31
- method: "POST",
32
- headers: {
33
- "Content-Type": "application/json"
34
- },
35
- body: JSON.stringify(payload)
36
- }).catch(() => {
29
+ var _config;
30
+ var queue = [];
31
+ var flushTimer = null;
32
+ var isFlushing = false;
33
+ function scheduleFlush() {
34
+ if (flushTimer)
35
+ return;
36
+ flushTimer = setTimeout(() => {
37
+ flushTimer = null;
38
+ flush();
39
+ }, 2e3);
40
+ }
41
+ async function flush() {
42
+ if (isFlushing || queue.length === 0)
43
+ return;
44
+ isFlushing = true;
45
+ const batch = queue.splice(0, 10);
46
+ for (const payload of batch) {
47
+ await sendNow(payload);
48
+ }
49
+ isFlushing = false;
50
+ if (queue.length > 0)
51
+ flush();
52
+ }
53
+ async function sendNow(payload, attempts = 3) {
54
+ for (let i = 0; i < attempts; i++) {
55
+ try {
56
+ const res = await fetch(ENDPOINT, {
57
+ method: "POST",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ "x-api-key": _config?.apiKey ?? ""
61
+ },
62
+ body: JSON.stringify(payload)
63
+ });
64
+ if (res.ok)
65
+ return;
66
+ } catch {
67
+ }
68
+ await sleep(1e3 * (i + 1));
69
+ }
70
+ }
71
+ function sleep(ms) {
72
+ return new Promise((resolve) => setTimeout(resolve, ms));
73
+ }
74
+ function enqueue(payload) {
75
+ if (queue.length >= 100)
76
+ return;
77
+ queue.push(payload);
78
+ scheduleFlush();
79
+ }
80
+ function sendImmediate(payload) {
81
+ sendNow(payload).catch(() => {
37
82
  });
38
83
  }
39
- function sendError(data) {
40
- post({
84
+ function getUrl() {
85
+ if (typeof window !== "undefined")
86
+ return window.location.href;
87
+ try {
88
+ return require("os").hostname();
89
+ } catch {
90
+ return "server";
91
+ }
92
+ }
93
+ function getBrowser() {
94
+ if (typeof navigator !== "undefined")
95
+ return navigator.userAgent;
96
+ return `Node.js ${typeof process !== "undefined" ? process.version : "unknown"}`;
97
+ }
98
+ function getEnvironment() {
99
+ return _config?.environment ?? (typeof window !== "undefined" ? "browser" : "server");
100
+ }
101
+ function parseStack(stack) {
102
+ if (!stack)
103
+ return { file: "unknown", line: 0, column: 0 };
104
+ const match = stack.match(/at .+ \((.+):(\d+):(\d+)\)/) || stack.match(/at (.+):(\d+):(\d+)/);
105
+ return {
106
+ file: match?.[1]?.split("/")?.pop() || "unknown",
107
+ line: parseInt(match?.[2] || "0"),
108
+ column: parseInt(match?.[3] || "0")
109
+ };
110
+ }
111
+ function getErrorCode(error) {
112
+ return error?.code || error?.status?.toString() || error?.statusCode?.toString() || error?.name || "ERR_UNKNOWN";
113
+ }
114
+ function classifyError(error, context) {
115
+ const msg = String(error?.message || error || "").toLowerCase();
116
+ const name = String(error?.name || "").toLowerCase();
117
+ if (msg.includes("stripe") || msg.includes("payment") || msg.includes("card declined") || msg.includes("checkout") || msg.includes("refund"))
118
+ return { category: "Payment Error", severity: "critical" };
119
+ if (msg.includes("jwt") || msg.includes("token expired") || msg.includes("unauthorized") || msg.includes("session") || msg.includes("oauth") || msg.includes("login failed"))
120
+ return { category: "Auth Error", severity: "high" };
121
+ if (msg.includes("supabase") || msg.includes("database") || msg.includes("query") || msg.includes("connection lost") || msg.includes("transaction") || msg.includes("duplicate key") || msg.includes("foreign key"))
122
+ return { category: "Database Error", severity: "critical" };
123
+ if (msg.includes("hydration") || msg.includes("does not match server"))
124
+ return { category: "Hydration Error", severity: "high" };
125
+ if (msg.includes("invalid hook") || msg.includes("rules of hooks"))
126
+ return { category: "Hook Error", severity: "critical" };
127
+ if (msg.includes("render") || msg.includes("error boundary"))
128
+ return { category: "Render Error", severity: "critical" };
129
+ if (msg.includes("dynamic import") || msg.includes("failed to fetch dynamically"))
130
+ return { category: "Import Error", severity: "high" };
131
+ if (msg.includes("cors") || msg.includes("cross-origin"))
132
+ return { category: "CORS Error", severity: "high" };
133
+ if (msg.includes("fetch failed") || msg.includes("failed to fetch") || name === "fetcherror")
134
+ return { category: "Network Error", severity: "high" };
135
+ if (msg.includes("timeout") || msg.includes("timed out") || msg.includes("etimedout"))
136
+ return { category: "Timeout Error", severity: "medium" };
137
+ if (msg.includes("websocket"))
138
+ return { category: "WebSocket Error", severity: "high" };
139
+ if (msg.includes("http 401") || msg.includes("xhr 401"))
140
+ return { category: "Auth Error", severity: "high" };
141
+ if (msg.includes("http 403") || msg.includes("xhr 403"))
142
+ return { category: "Auth Error", severity: "high" };
143
+ if (msg.includes("http 404") || msg.includes("xhr 404"))
144
+ return { category: "Not Found Error", severity: "medium" };
145
+ if (msg.includes("http 500") || msg.includes("xhr 500"))
146
+ return { category: "Server Error", severity: "critical" };
147
+ if (msg.includes("http 503") || msg.includes("xhr 503"))
148
+ return { category: "Server Error", severity: "critical" };
149
+ if (msg.includes("maximum call stack") || msg.includes("out of memory") || msg.includes("heap limit"))
150
+ return { category: "Memory Error", severity: "critical" };
151
+ if (msg.includes("cannot find module") || msg.includes("module not found"))
152
+ return { category: "Module Error", severity: "critical" };
153
+ if (msg.includes("econnrefused") || msg.includes("connection refused"))
154
+ return { category: "Connection Error", severity: "critical" };
155
+ if (msg.includes("email") || msg.includes("smtp") || msg.includes("sendgrid"))
156
+ return { category: "Email Error", severity: "high" };
157
+ if (msg.includes("cron") || msg.includes("webhook") || msg.includes("queue"))
158
+ return { category: "Job Error", severity: "high" };
159
+ if (msg.includes("upload") || msg.includes("file size") || msg.includes("invalid file"))
160
+ return { category: "File Error", severity: "medium" };
161
+ if (msg.includes("quota exceeded") || msg.includes("localstorage") || msg.includes("indexeddb"))
162
+ return { category: "Storage Error", severity: "medium" };
163
+ if (name === "typeerror")
164
+ return { category: "TypeError", severity: "high" };
165
+ if (name === "referenceerror")
166
+ return { category: "ReferenceError", severity: "critical" };
167
+ if (name === "rangeerror")
168
+ return { category: "RangeError", severity: "high" };
169
+ if (name === "syntaxerror")
170
+ return { category: "SyntaxError", severity: "high" };
171
+ if (context === "unhandledrejection")
172
+ return { category: "Promise Error", severity: "medium" };
173
+ if (context === "express")
174
+ return { category: "Server Error", severity: "high" };
175
+ if (context === "resource")
176
+ return { category: "Resource Error", severity: "low" };
177
+ return { category: "Unknown Error", severity: "medium" };
178
+ }
179
+ function buildErrorPayload(error, context) {
180
+ const message = error?.message || String(error) || "Unknown error";
181
+ const stack = error?.stack || "";
182
+ const { file, line, column } = parseStack(stack);
183
+ const { category, severity } = classifyError(error, context);
184
+ return {
41
185
  type: "ERROR",
42
- apiKey: config.apiKey,
43
- message: data.message,
44
- code: data.code ?? "Error",
45
- stack: data.stack ?? null,
46
- file: data.file ?? null,
47
- line: data.line ?? null,
48
- column: data.column ?? null,
49
- url: typeof window !== "undefined" ? window.location.href : null,
186
+ apiKey: _config?.apiKey,
187
+ message,
188
+ code: getErrorCode(error),
189
+ stack,
190
+ file,
191
+ line,
192
+ column,
193
+ url: getUrl(),
50
194
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
51
- environment: config.environment ?? "production",
52
- browser: typeof navigator !== "undefined" ? navigator.userAgent : "node",
53
- error_category: data.code ?? "Error",
54
- severity: data.severity ?? "high",
55
- status: "open"
195
+ environment: getEnvironment(),
196
+ browser: getBrowser(),
197
+ error_category: category,
198
+ severity,
199
+ status: "open",
200
+ context: context || "auto"
201
+ };
202
+ }
203
+ function activateBrowserListeners() {
204
+ window.addEventListener("error", (event) => {
205
+ const target = event.target;
206
+ if (target && target.tagName && ["IMG", "SCRIPT", "LINK", "VIDEO", "AUDIO"].includes(target.tagName)) {
207
+ const src = target.src || target.href || "unknown";
208
+ enqueue(buildErrorPayload({ name: "ResourceError", message: `${target.tagName} failed to load: ${src}`, stack: "" }, "resource"));
209
+ return;
210
+ }
211
+ const err = event.error || {
212
+ name: "Error",
213
+ message: event.message,
214
+ stack: `at ${event.filename}:${event.lineno}:${event.colno}`
215
+ };
216
+ enqueue(buildErrorPayload(err, "window"));
217
+ }, true);
218
+ window.addEventListener("unhandledrejection", (event) => {
219
+ const err = event.reason instanceof Error ? event.reason : { name: "UnhandledRejection", message: String(event.reason || "Unhandled Promise Rejection"), stack: "" };
220
+ enqueue(buildErrorPayload(err, "unhandledrejection"));
221
+ });
222
+ const originalFetch = window.fetch;
223
+ window.fetch = async function(...args) {
224
+ const url = typeof args[0] === "string" ? args[0] : args[0] instanceof URL ? args[0].toString() : args[0]?.url ?? "";
225
+ if (url.includes("rapid-processor"))
226
+ return originalFetch(...args);
227
+ try {
228
+ const response = await originalFetch(...args);
229
+ if (!response.ok) {
230
+ enqueue(buildErrorPayload({
231
+ name: `HTTP_${response.status}`,
232
+ message: `HTTP ${response.status}: ${args[1]?.method || "GET"} ${url}`,
233
+ stack: `${args[1]?.method || "GET"} ${url} \u2192 ${response.status} ${response.statusText}`,
234
+ status: response.status
235
+ }, "fetch"));
236
+ }
237
+ return response;
238
+ } catch (err) {
239
+ enqueue(buildErrorPayload({
240
+ name: "FetchError",
241
+ message: `Fetch failed: ${args[1]?.method || "GET"} ${url} \u2014 ${err.message}`,
242
+ stack: err.stack
243
+ }, "fetch"));
244
+ throw err;
245
+ }
246
+ };
247
+ const originalOpen = XMLHttpRequest.prototype.open;
248
+ const originalSend = XMLHttpRequest.prototype.send;
249
+ XMLHttpRequest.prototype.open = function(method, url, ...rest) {
250
+ this._r_method = method;
251
+ this._r_url = url;
252
+ return originalOpen.call(this, method, url, ...rest);
253
+ };
254
+ XMLHttpRequest.prototype.send = function(...args) {
255
+ const url = this._r_url || "";
256
+ const method = this._r_method || "GET";
257
+ if (!url.includes("rapid-processor")) {
258
+ this.addEventListener("loadend", () => {
259
+ if (this.status >= 400 || this.status === 0) {
260
+ enqueue(buildErrorPayload({
261
+ name: `XHR_${this.status}`,
262
+ message: `XHR ${this.status}: ${method} ${url}`,
263
+ stack: `${method} ${url} \u2192 ${this.status} ${this.statusText}`,
264
+ status: this.status
265
+ }, "xhr"));
266
+ }
267
+ });
268
+ }
269
+ return originalSend.apply(this, args);
270
+ };
271
+ window.addEventListener("beforeunload", () => {
272
+ try {
273
+ navigator.sendBeacon(
274
+ ENDPOINT,
275
+ JSON.stringify({
276
+ type: "SDK_DISCONNECTED",
277
+ apiKey: _config?.apiKey,
278
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
279
+ environment: getEnvironment(),
280
+ url: getUrl()
281
+ })
282
+ );
283
+ } catch {
284
+ }
56
285
  });
57
286
  }
287
+ function activateServerListeners() {
288
+ process.on("uncaughtException", (error) => {
289
+ enqueue(buildErrorPayload(error, "uncaughtException"));
290
+ flush();
291
+ });
292
+ process.on("unhandledRejection", (reason) => {
293
+ enqueue(buildErrorPayload(
294
+ reason instanceof Error ? reason : { name: "UnhandledRejection", message: String(reason), stack: "" },
295
+ "unhandledrejection"
296
+ ));
297
+ });
298
+ const shutdown = async (signal) => {
299
+ await sendNow({
300
+ type: "SDK_DISCONNECTED",
301
+ apiKey: _config?.apiKey,
302
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
303
+ environment: getEnvironment(),
304
+ url: getUrl(),
305
+ signal
306
+ });
307
+ process.exit(0);
308
+ };
309
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
310
+ process.on("SIGINT", () => shutdown("SIGINT"));
311
+ }
58
312
  var Reportli = {
59
313
  init(cfg) {
60
314
  if (initialized)
61
315
  return;
62
- config = cfg;
316
+ if (!cfg?.apiKey)
317
+ return;
318
+ _config = cfg;
63
319
  initialized = true;
64
- console.log(
65
- "\u2705 Reportli initialized successfully. Error monitoring is active."
66
- );
67
- window.addEventListener("error", (event) => {
68
- if (event.error instanceof Error) {
69
- sendError({
70
- message: event.error.message,
71
- code: event.error.name,
72
- stack: event.error.stack,
73
- file: event.filename,
74
- line: event.lineno,
75
- column: event.colno
76
- });
77
- } else if (event.target) {
78
- sendError({
79
- message: "Resource failed to load",
80
- code: "ResourceLoadError"
81
- });
82
- }
83
- }, true);
84
- window.addEventListener("unhandledrejection", (event) => {
85
- const err = event.reason;
86
- sendError({
87
- message: err?.message ?? String(err),
88
- code: err?.name ?? "UnhandledPromiseRejection",
89
- stack: err?.stack
90
- });
320
+ sendImmediate({
321
+ type: "SDK_INITIALIZED",
322
+ apiKey: cfg.apiKey,
323
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
324
+ environment: getEnvironment(),
325
+ url: getUrl(),
326
+ browser: getBrowser()
91
327
  });
92
- const originalFetch = window.fetch;
93
- window.fetch = async (...args) => {
94
- try {
95
- const response = await originalFetch(...args);
96
- if (!response.ok) {
97
- sendError({
98
- message: `Fetch HTTP ${response.status}`,
99
- code: `HTTP_${response.status}`,
100
- severity: "medium"
101
- });
102
- }
103
- return response;
104
- } catch (e) {
105
- sendError({
106
- message: e?.message ?? "Fetch failed",
107
- code: "FetchError",
108
- stack: e?.stack
109
- });
110
- throw e;
111
- }
112
- };
113
- const open = XMLHttpRequest.prototype.open;
114
- const send = XMLHttpRequest.prototype.send;
115
- XMLHttpRequest.prototype.open = function(method, url, ...rest) {
116
- this.__reportli_url = url;
117
- return open.call(this, method, url, ...rest);
118
- };
119
- XMLHttpRequest.prototype.send = function(...args) {
120
- this.addEventListener("load", function() {
121
- if (this.status >= 400) {
122
- sendError({
123
- message: `XHR HTTP ${this.status}`,
124
- code: `XHR_${this.status}`
125
- });
126
- }
127
- });
128
- this.addEventListener("error", function() {
129
- sendError({
130
- message: "XHR connection failed",
131
- code: "XHRConnectionError"
132
- });
133
- });
134
- return send.apply(this, args);
135
- };
328
+ if (typeof window !== "undefined") {
329
+ activateBrowserListeners();
330
+ } else if (typeof process !== "undefined" && process.versions?.node) {
331
+ activateServerListeners();
332
+ }
136
333
  },
137
334
  capture(error) {
138
- if (error instanceof Error) {
139
- sendError({
140
- message: error.message,
141
- code: error.name,
142
- stack: error.stack
143
- });
144
- } else {
145
- sendError({
146
- message: String(error),
147
- code: "ManualCapture"
148
- });
149
- }
335
+ if (!initialized)
336
+ return;
337
+ const err = error instanceof Error ? error : { name: "ManualCapture", message: String(error), stack: new Error().stack };
338
+ enqueue(buildErrorPayload(err, "manual"));
150
339
  },
151
340
  captureMessage(message) {
152
- sendError({
153
- message,
154
- code: "Message",
155
- severity: "low"
156
- });
341
+ if (!initialized)
342
+ return;
343
+ enqueue(buildErrorPayload({ name: "Message", message, stack: "" }, "manual"));
344
+ },
345
+ errorHandler() {
346
+ return function(err, _req, _res, next) {
347
+ enqueue(buildErrorPayload(err, "express"));
348
+ next(err);
349
+ };
157
350
  }
158
351
  };
352
+ var src_default = Reportli;
159
353
  // Annotate the CommonJS export names for ESM import in node:
160
354
  0 && (module.exports = {
161
355
  Reportli
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// reportli.ts\n\nconst ENDPOINT =\n \"https://fahikyfmgdyzejdfftox.supabase.co/functions/v1/rapid-processor\";\n\ntype Config = {\n apiKey: string;\n environment?: string;\n};\n\nlet initialized = false;\nlet config: Config;\n\nfunction post(payload: Record<string, unknown>) {\n fetch(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n }).catch(() => {\n // Never throw from the SDK.\n });\n}\n\nfunction sendError(data: {\n message: string;\n code?: string;\n stack?: string;\n file?: string;\n line?: number;\n column?: number;\n severity?: string;\n}) {\n post({\n type: \"ERROR\",\n apiKey: config.apiKey,\n message: data.message,\n code: data.code ?? \"Error\",\n stack: data.stack ?? null,\n file: data.file ?? null,\n line: data.line ?? null,\n column: data.column ?? null,\n url:\n typeof window !== \"undefined\" ? window.location.href : null,\n timestamp: new Date().toISOString(),\n environment: config.environment ?? \"production\",\n browser:\n typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : \"node\",\n error_category: data.code ?? \"Error\",\n severity: data.severity ?? \"high\",\n status: \"open\",\n });\n}\n\nexport const Reportli = {\n init(cfg: Config) {\n if (initialized) return;\n\n config = cfg;\n initialized = true;\n\n console.log(\n \"\u2705 Reportli initialized successfully. Error monitoring is active.\"\n );\n\n // JS errors\n window.addEventListener(\"error\", (event: any) => {\n if (event.error instanceof Error) {\n sendError({\n message: event.error.message,\n code: event.error.name,\n stack: event.error.stack,\n file: event.filename,\n line: event.lineno,\n column: event.colno,\n });\n } else if (event.target) {\n // Resource load failure\n sendError({\n message: \"Resource failed to load\",\n code: \"ResourceLoadError\",\n });\n }\n }, true);\n\n // Promise rejections\n window.addEventListener(\"unhandledrejection\", (event: any) => {\n const err = event.reason;\n sendError({\n message: err?.message ?? String(err),\n code: err?.name ?? \"UnhandledPromiseRejection\",\n stack: err?.stack,\n });\n });\n\n // fetch interception\n const originalFetch = window.fetch;\n window.fetch = async (...args) => {\n try {\n const response = await originalFetch(...args);\n\n if (!response.ok) {\n sendError({\n message: `Fetch HTTP ${response.status}`,\n code: `HTTP_${response.status}`,\n severity: \"medium\",\n });\n }\n\n return response;\n } catch (e: any) {\n sendError({\n message: e?.message ?? \"Fetch failed\",\n code: \"FetchError\",\n stack: e?.stack,\n });\n throw e;\n }\n };\n\n // XMLHttpRequest interception\n const open = XMLHttpRequest.prototype.open;\n const send = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (\n method,\n url,\n ...rest\n ) {\n (this as any).__reportli_url = url;\n return open.call(this, method, url, ...rest);\n };\n\n XMLHttpRequest.prototype.send = function (...args) {\n this.addEventListener(\"load\", function () {\n if (this.status >= 400) {\n sendError({\n message: `XHR HTTP ${this.status}`,\n code: `XHR_${this.status}`,\n });\n }\n });\n\n this.addEventListener(\"error\", function () {\n sendError({\n message: \"XHR connection failed\",\n code: \"XHRConnectionError\",\n });\n });\n\n return send.apply(this, args as any);\n };\n },\n\n capture(error: unknown) {\n if (error instanceof Error) {\n sendError({\n message: error.message,\n code: error.name,\n stack: error.stack,\n });\n } else {\n sendError({\n message: String(error),\n code: \"ManualCapture\",\n });\n }\n },\n\n captureMessage(message: string) {\n sendError({\n message,\n code: \"Message\",\n severity: \"low\",\n });\n },\n};"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// src/index.ts \u2014 Reportli SDK v1.0.3\n\nconst ENDPOINT =\n \"https://fahikyfmgdyzejdfftox.supabase.co/functions/v1/rapid-processor\";\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype Config = {\n apiKey: string;\n environment?: string;\n};\n\ntype QueueItem = Record<string, unknown>;\n\n// \u2500\u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet initialized = false;\nlet _config: Config;\nconst queue: QueueItem[] = [];\nlet flushTimer: ReturnType<typeof setTimeout> | null = null;\nlet isFlushing = false;\n\n// \u2500\u2500\u2500 Queue & Batch Send \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction scheduleFlush() {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flush();\n }, 2000); // batch every 2 seconds\n}\n\nasync function flush() {\n if (isFlushing || queue.length === 0) return;\n isFlushing = true;\n\n const batch = queue.splice(0, 10); // send max 10 at a time\n\n for (const payload of batch) {\n await sendNow(payload);\n }\n\n isFlushing = false;\n\n if (queue.length > 0) flush(); // flush remaining\n}\n\nasync function sendNow(payload: QueueItem, attempts = 3): Promise<void> {\n for (let i = 0; i < attempts; i++) {\n try {\n const res = await fetch(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": _config?.apiKey ?? \"\",\n },\n body: JSON.stringify(payload),\n });\n if (res.ok) return; // success \u2014 stop retrying\n } catch {\n // network error \u2014 wait before retry\n }\n await sleep(1000 * (i + 1)); // 1s, 2s, 3s\n }\n // give up silently after 3 attempts \u2014 never crash user app\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// \u2500\u2500\u2500 Enqueue \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction enqueue(payload: QueueItem) {\n if (queue.length >= 100) return; // cap queue to prevent memory issues\n queue.push(payload);\n scheduleFlush();\n}\n\n// \u2500\u2500\u2500 Send immediately (for critical messages) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction sendImmediate(payload: QueueItem) {\n sendNow(payload).catch(() => {}); // fire and forget\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getUrl(): string {\n if (typeof window !== \"undefined\") return window.location.href;\n try { return require(\"os\").hostname(); } catch { return \"server\"; }\n}\n\nfunction getBrowser(): string {\n if (typeof navigator !== \"undefined\") return navigator.userAgent;\n return `Node.js ${typeof process !== \"undefined\" ? process.version : \"unknown\"}`;\n}\n\nfunction getEnvironment(): string {\n return _config?.environment ?? (typeof window !== \"undefined\" ? \"browser\" : \"server\");\n}\n\nfunction parseStack(stack: string | undefined): { file: string; line: number; column: number } {\n if (!stack) return { file: \"unknown\", line: 0, column: 0 };\n const match =\n stack.match(/at .+ \\((.+):(\\d+):(\\d+)\\)/) ||\n stack.match(/at (.+):(\\d+):(\\d+)/);\n return {\n file: match?.[1]?.split(\"/\")?.pop() || \"unknown\",\n line: parseInt(match?.[2] || \"0\"),\n column: parseInt(match?.[3] || \"0\"),\n };\n}\n\nfunction getErrorCode(error: any): string {\n return (\n error?.code ||\n error?.status?.toString() ||\n error?.statusCode?.toString() ||\n error?.name ||\n \"ERR_UNKNOWN\"\n );\n}\n\nfunction classifyError(error: any, context?: string): { category: string; severity: \"low\" | \"medium\" | \"high\" | \"critical\" } {\n const msg = String(error?.message || error || \"\").toLowerCase();\n const name = String(error?.name || \"\").toLowerCase();\n\n // Payment \u2014 always critical\n if (msg.includes(\"stripe\") || msg.includes(\"payment\") || msg.includes(\"card declined\") || msg.includes(\"checkout\") || msg.includes(\"refund\"))\n return { category: \"Payment Error\", severity: \"critical\" };\n\n // Auth\n if (msg.includes(\"jwt\") || msg.includes(\"token expired\") || msg.includes(\"unauthorized\") || msg.includes(\"session\") || msg.includes(\"oauth\") || msg.includes(\"login failed\"))\n return { category: \"Auth Error\", severity: \"high\" };\n\n // Database\n if (msg.includes(\"supabase\") || msg.includes(\"database\") || msg.includes(\"query\") || msg.includes(\"connection lost\") || msg.includes(\"transaction\") || msg.includes(\"duplicate key\") || msg.includes(\"foreign key\"))\n return { category: \"Database Error\", severity: \"critical\" };\n\n // React/Next.js\n if (msg.includes(\"hydration\") || msg.includes(\"does not match server\"))\n return { category: \"Hydration Error\", severity: \"high\" };\n if (msg.includes(\"invalid hook\") || msg.includes(\"rules of hooks\"))\n return { category: \"Hook Error\", severity: \"critical\" };\n if (msg.includes(\"render\") || msg.includes(\"error boundary\"))\n return { category: \"Render Error\", severity: \"critical\" };\n if (msg.includes(\"dynamic import\") || msg.includes(\"failed to fetch dynamically\"))\n return { category: \"Import Error\", severity: \"high\" };\n\n // Network\n if (msg.includes(\"cors\") || msg.includes(\"cross-origin\"))\n return { category: \"CORS Error\", severity: \"high\" };\n if (msg.includes(\"fetch failed\") || msg.includes(\"failed to fetch\") || name === \"fetcherror\")\n return { category: \"Network Error\", severity: \"high\" };\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"etimedout\"))\n return { category: \"Timeout Error\", severity: \"medium\" };\n if (msg.includes(\"websocket\"))\n return { category: \"WebSocket Error\", severity: \"high\" };\n\n // HTTP status codes\n if (msg.includes(\"http 401\") || msg.includes(\"xhr 401\"))\n return { category: \"Auth Error\", severity: \"high\" };\n if (msg.includes(\"http 403\") || msg.includes(\"xhr 403\"))\n return { category: \"Auth Error\", severity: \"high\" };\n if (msg.includes(\"http 404\") || msg.includes(\"xhr 404\"))\n return { category: \"Not Found Error\", severity: \"medium\" };\n if (msg.includes(\"http 500\") || msg.includes(\"xhr 500\"))\n return { category: \"Server Error\", severity: \"critical\" };\n if (msg.includes(\"http 503\") || msg.includes(\"xhr 503\"))\n return { category: \"Server Error\", severity: \"critical\" };\n\n // Memory\n if (msg.includes(\"maximum call stack\") || msg.includes(\"out of memory\") || msg.includes(\"heap limit\"))\n return { category: \"Memory Error\", severity: \"critical\" };\n\n // Server\n if (msg.includes(\"cannot find module\") || msg.includes(\"module not found\"))\n return { category: \"Module Error\", severity: \"critical\" };\n if (msg.includes(\"econnrefused\") || msg.includes(\"connection refused\"))\n return { category: \"Connection Error\", severity: \"critical\" };\n\n // Email & Jobs\n if (msg.includes(\"email\") || msg.includes(\"smtp\") || msg.includes(\"sendgrid\"))\n return { category: \"Email Error\", severity: \"high\" };\n if (msg.includes(\"cron\") || msg.includes(\"webhook\") || msg.includes(\"queue\"))\n return { category: \"Job Error\", severity: \"high\" };\n\n // Files\n if (msg.includes(\"upload\") || msg.includes(\"file size\") || msg.includes(\"invalid file\"))\n return { category: \"File Error\", severity: \"medium\" };\n\n // Storage\n if (msg.includes(\"quota exceeded\") || msg.includes(\"localstorage\") || msg.includes(\"indexeddb\"))\n return { category: \"Storage Error\", severity: \"medium\" };\n\n // JS core\n if (name === \"typeerror\") return { category: \"TypeError\", severity: \"high\" };\n if (name === \"referenceerror\") return { category: \"ReferenceError\", severity: \"critical\" };\n if (name === \"rangeerror\") return { category: \"RangeError\", severity: \"high\" };\n if (name === \"syntaxerror\") return { category: \"SyntaxError\", severity: \"high\" };\n\n // Context based\n if (context === \"unhandledrejection\") return { category: \"Promise Error\", severity: \"medium\" };\n if (context === \"express\") return { category: \"Server Error\", severity: \"high\" };\n if (context === \"resource\") return { category: \"Resource Error\", severity: \"low\" };\n\n return { category: \"Unknown Error\", severity: \"medium\" };\n}\n\nfunction buildErrorPayload(error: any, context?: string): QueueItem {\n const message = error?.message || String(error) || \"Unknown error\";\n const stack = error?.stack || \"\";\n const { file, line, column } = parseStack(stack);\n const { category, severity } = classifyError(error, context);\n\n return {\n type: \"ERROR\",\n apiKey: _config?.apiKey,\n message,\n code: getErrorCode(error),\n stack,\n file,\n line,\n column,\n url: getUrl(),\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n browser: getBrowser(),\n error_category: category,\n severity,\n status: \"open\",\n context: context || \"auto\",\n };\n}\n\n// \u2500\u2500\u2500 Browser Listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateBrowserListeners() {\n // JS errors + resource errors\n window.addEventListener(\"error\", (event) => {\n // Resource load error (img, script, link, video)\n const target = event.target as HTMLElement;\n if (target && target.tagName && [\"IMG\", \"SCRIPT\", \"LINK\", \"VIDEO\", \"AUDIO\"].includes(target.tagName)) {\n const src = (target as any).src || (target as any).href || \"unknown\";\n enqueue(buildErrorPayload({ name: \"ResourceError\", message: `${target.tagName} failed to load: ${src}`, stack: \"\" }, \"resource\"));\n return;\n }\n\n const err = (event as ErrorEvent).error || {\n name: \"Error\",\n message: (event as ErrorEvent).message,\n stack: `at ${(event as ErrorEvent).filename}:${(event as ErrorEvent).lineno}:${(event as ErrorEvent).colno}`,\n };\n enqueue(buildErrorPayload(err, \"window\"));\n }, true);\n\n // Unhandled promise rejections\n window.addEventListener(\"unhandledrejection\", (event) => {\n const err = event.reason instanceof Error\n ? event.reason\n : { name: \"UnhandledRejection\", message: String(event.reason || \"Unhandled Promise Rejection\"), stack: \"\" };\n enqueue(buildErrorPayload(err, \"unhandledrejection\"));\n });\n\n // Intercept fetch \u2014 catches all API errors automatically\n const originalFetch = window.fetch;\n window.fetch = async function (...args: Parameters<typeof fetch>): Promise<Response> {\n const url = typeof args[0] === \"string\"\n ? args[0]\n : args[0] instanceof URL\n ? args[0].toString()\n : (args[0] as Request)?.url ?? \"\";\n\n // Never intercept our own requests\n if (url.includes(\"rapid-processor\")) return originalFetch(...args);\n\n try {\n const response = await originalFetch(...args);\n if (!response.ok) {\n enqueue(buildErrorPayload({\n name: `HTTP_${response.status}`,\n message: `HTTP ${response.status}: ${(args[1] as RequestInit)?.method || \"GET\"} ${url}`,\n stack: `${(args[1] as RequestInit)?.method || \"GET\"} ${url} \u2192 ${response.status} ${response.statusText}`,\n status: response.status,\n }, \"fetch\"));\n }\n return response;\n } catch (err: any) {\n enqueue(buildErrorPayload({\n name: \"FetchError\",\n message: `Fetch failed: ${(args[1] as RequestInit)?.method || \"GET\"} ${url} \u2014 ${err.message}`,\n stack: err.stack,\n }, \"fetch\"));\n throw err;\n }\n };\n\n // Intercept XHR\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (method: string, url: string, ...rest: any[]) {\n (this as any)._r_method = method;\n (this as any)._r_url = url;\n return originalOpen.call(this, method, url, ...rest);\n } as any;\n\n XMLHttpRequest.prototype.send = function (...args: any[]) {\n const url: string = (this as any)._r_url || \"\";\n const method: string = (this as any)._r_method || \"GET\";\n\n if (!url.includes(\"rapid-processor\")) {\n this.addEventListener(\"loadend\", () => {\n if (this.status >= 400 || this.status === 0) {\n enqueue(buildErrorPayload({\n name: `XHR_${this.status}`,\n message: `XHR ${this.status}: ${method} ${url}`,\n stack: `${method} ${url} \u2192 ${this.status} ${this.statusText}`,\n status: this.status,\n }, \"xhr\"));\n }\n });\n }\n\n return originalSend.apply(this, args);\n } as any;\n\n // Disconnect when page closes\n window.addEventListener(\"beforeunload\", () => {\n try {\n navigator.sendBeacon(\n ENDPOINT,\n JSON.stringify({\n type: \"SDK_DISCONNECTED\",\n apiKey: _config?.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n })\n );\n } catch { /* silent */ }\n });\n}\n\n// \u2500\u2500\u2500 Server Listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateServerListeners() {\n process.on(\"uncaughtException\", (error: Error) => {\n enqueue(buildErrorPayload(error, \"uncaughtException\"));\n flush(); // flush immediately on crash\n });\n\n process.on(\"unhandledRejection\", (reason: any) => {\n enqueue(buildErrorPayload(\n reason instanceof Error ? reason : { name: \"UnhandledRejection\", message: String(reason), stack: \"\" },\n \"unhandledrejection\"\n ));\n });\n\n const shutdown = async (signal: string) => {\n await sendNow({\n type: \"SDK_DISCONNECTED\",\n apiKey: _config?.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n signal,\n });\n process.exit(0);\n };\n\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const Reportli = {\n init(cfg: Config) {\n if (initialized) return;\n if (!cfg?.apiKey) return;\n\n _config = cfg;\n initialized = true;\n\n // Send SDK_INITIALIZED immediately \u2014 not queued\n sendImmediate({\n type: \"SDK_INITIALIZED\",\n apiKey: cfg.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n browser: getBrowser(),\n });\n\n // Activate listeners\n if (typeof window !== \"undefined\") {\n activateBrowserListeners();\n } else if (typeof process !== \"undefined\" && process.versions?.node) {\n activateServerListeners();\n }\n },\n\n capture(error: unknown) {\n if (!initialized) return;\n const err = error instanceof Error\n ? error\n : { name: \"ManualCapture\", message: String(error), stack: new Error().stack };\n enqueue(buildErrorPayload(err, \"manual\"));\n },\n\n captureMessage(message: string) {\n if (!initialized) return;\n enqueue(buildErrorPayload({ name: \"Message\", message, stack: \"\" }, \"manual\"));\n },\n\n errorHandler() {\n return function (err: any, _req: any, _res: any, next: any) {\n enqueue(buildErrorPayload(err, \"express\"));\n next(err);\n };\n },\n};\n\nexport default Reportli;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAM,WACJ;AAaF,IAAI,cAAc;AAClB,IAAI;AACJ,IAAM,QAAqB,CAAC;AAC5B,IAAI,aAAmD;AACvD,IAAI,aAAa;AAIjB,SAAS,gBAAgB;AACvB,MAAI;AAAY;AAChB,eAAa,WAAW,MAAM;AAC5B,iBAAa;AACb,UAAM;AAAA,EACR,GAAG,GAAI;AACT;AAEA,eAAe,QAAQ;AACrB,MAAI,cAAc,MAAM,WAAW;AAAG;AACtC,eAAa;AAEb,QAAM,QAAQ,MAAM,OAAO,GAAG,EAAE;AAEhC,aAAW,WAAW,OAAO;AAC3B,UAAM,QAAQ,OAAO;AAAA,EACvB;AAEA,eAAa;AAEb,MAAI,MAAM,SAAS;AAAG,UAAM;AAC9B;AAEA,eAAe,QAAQ,SAAoB,WAAW,GAAkB;AACtE,WAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,UAAU;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,SAAS,UAAU;AAAA,QAClC;AAAA,QACA,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AACD,UAAI,IAAI;AAAI;AAAA,IACd,QAAQ;AAAA,IAER;AACA,UAAM,MAAM,OAAQ,IAAI,EAAE;AAAA,EAC5B;AAEF;AAEA,SAAS,MAAM,IAAY;AACzB,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAIA,SAAS,QAAQ,SAAoB;AACnC,MAAI,MAAM,UAAU;AAAK;AACzB,QAAM,KAAK,OAAO;AAClB,gBAAc;AAChB;AAIA,SAAS,cAAc,SAAoB;AACzC,UAAQ,OAAO,EAAE,MAAM,MAAM;AAAA,EAAC,CAAC;AACjC;AAIA,SAAS,SAAiB;AACxB,MAAI,OAAO,WAAW;AAAa,WAAO,OAAO,SAAS;AAC1D,MAAI;AAAE,WAAO,QAAQ,IAAI,EAAE,SAAS;AAAA,EAAG,QAAQ;AAAE,WAAO;AAAA,EAAU;AACpE;AAEA,SAAS,aAAqB;AAC5B,MAAI,OAAO,cAAc;AAAa,WAAO,UAAU;AACvD,SAAO,WAAW,OAAO,YAAY,cAAc,QAAQ,UAAU,SAAS;AAChF;AAEA,SAAS,iBAAyB;AAChC,SAAO,SAAS,gBAAgB,OAAO,WAAW,cAAc,YAAY;AAC9E;AAEA,SAAS,WAAW,OAA2E;AAC7F,MAAI,CAAC;AAAO,WAAO,EAAE,MAAM,WAAW,MAAM,GAAG,QAAQ,EAAE;AACzD,QAAM,QACJ,MAAM,MAAM,4BAA4B,KACxC,MAAM,MAAM,qBAAqB;AACnC,SAAO;AAAA,IACL,MAAM,QAAQ,CAAC,GAAG,MAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IACvC,MAAM,SAAS,QAAQ,CAAC,KAAK,GAAG;AAAA,IAChC,QAAQ,SAAS,QAAQ,CAAC,KAAK,GAAG;AAAA,EACpC;AACF;AAEA,SAAS,aAAa,OAAoB;AACxC,SACE,OAAO,QACP,OAAO,QAAQ,SAAS,KACxB,OAAO,YAAY,SAAS,KAC5B,OAAO,QACP;AAEJ;AAEA,SAAS,cAAc,OAAY,SAA0F;AAC3H,QAAM,MAAM,OAAO,OAAO,WAAW,SAAS,EAAE,EAAE,YAAY;AAC9D,QAAM,OAAO,OAAO,OAAO,QAAQ,EAAE,EAAE,YAAY;AAGnD,MAAI,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,QAAQ;AACzI,WAAO,EAAE,UAAU,iBAAiB,UAAU,WAAW;AAG3D,MAAI,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,cAAc;AACzK,WAAO,EAAE,UAAU,cAAc,UAAU,OAAO;AAGpD,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,aAAa,KAAK,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,aAAa;AAChN,WAAO,EAAE,UAAU,kBAAkB,UAAU,WAAW;AAG5D,MAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,uBAAuB;AACnE,WAAO,EAAE,UAAU,mBAAmB,UAAU,OAAO;AACzD,MAAI,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,gBAAgB;AAC/D,WAAO,EAAE,UAAU,cAAc,UAAU,WAAW;AACxD,MAAI,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,gBAAgB;AACzD,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAC1D,MAAI,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,6BAA6B;AAC9E,WAAO,EAAE,UAAU,gBAAgB,UAAU,OAAO;AAGtD,MAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,cAAc;AACrD,WAAO,EAAE,UAAU,cAAc,UAAU,OAAO;AACpD,MAAI,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,iBAAiB,KAAK,SAAS;AAC9E,WAAO,EAAE,UAAU,iBAAiB,UAAU,OAAO;AACvD,MAAI,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,WAAW;AAClF,WAAO,EAAE,UAAU,iBAAiB,UAAU,SAAS;AACzD,MAAI,IAAI,SAAS,WAAW;AAC1B,WAAO,EAAE,UAAU,mBAAmB,UAAU,OAAO;AAGzD,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,SAAS;AACpD,WAAO,EAAE,UAAU,cAAc,UAAU,OAAO;AACpD,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,SAAS;AACpD,WAAO,EAAE,UAAU,cAAc,UAAU,OAAO;AACpD,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,SAAS;AACpD,WAAO,EAAE,UAAU,mBAAmB,UAAU,SAAS;AAC3D,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,SAAS;AACpD,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAC1D,MAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,SAAS;AACpD,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAG1D,MAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,eAAe,KAAK,IAAI,SAAS,YAAY;AAClG,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAG1D,MAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,kBAAkB;AACvE,WAAO,EAAE,UAAU,gBAAgB,UAAU,WAAW;AAC1D,MAAI,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,oBAAoB;AACnE,WAAO,EAAE,UAAU,oBAAoB,UAAU,WAAW;AAG9D,MAAI,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,UAAU;AAC1E,WAAO,EAAE,UAAU,eAAe,UAAU,OAAO;AACrD,MAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,OAAO;AACzE,WAAO,EAAE,UAAU,aAAa,UAAU,OAAO;AAGnD,MAAI,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,cAAc;AACpF,WAAO,EAAE,UAAU,cAAc,UAAU,SAAS;AAGtD,MAAI,IAAI,SAAS,gBAAgB,KAAK,IAAI,SAAS,cAAc,KAAK,IAAI,SAAS,WAAW;AAC5F,WAAO,EAAE,UAAU,iBAAiB,UAAU,SAAS;AAGzD,MAAI,SAAS;AAAa,WAAO,EAAE,UAAU,aAAa,UAAU,OAAO;AAC3E,MAAI,SAAS;AAAkB,WAAO,EAAE,UAAU,kBAAkB,UAAU,WAAW;AACzF,MAAI,SAAS;AAAc,WAAO,EAAE,UAAU,cAAc,UAAU,OAAO;AAC7E,MAAI,SAAS;AAAe,WAAO,EAAE,UAAU,eAAe,UAAU,OAAO;AAG/E,MAAI,YAAY;AAAsB,WAAO,EAAE,UAAU,iBAAiB,UAAU,SAAS;AAC7F,MAAI,YAAY;AAAW,WAAO,EAAE,UAAU,gBAAgB,UAAU,OAAO;AAC/E,MAAI,YAAY;AAAY,WAAO,EAAE,UAAU,kBAAkB,UAAU,MAAM;AAEjF,SAAO,EAAE,UAAU,iBAAiB,UAAU,SAAS;AACzD;AAEA,SAAS,kBAAkB,OAAY,SAA6B;AAClE,QAAM,UAAU,OAAO,WAAW,OAAO,KAAK,KAAK;AACnD,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,EAAE,MAAM,MAAM,OAAO,IAAI,WAAW,KAAK;AAC/C,QAAM,EAAE,UAAU,SAAS,IAAI,cAAc,OAAO,OAAO;AAE3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA,MAAM,aAAa,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,aAAa,eAAe;AAAA,IAC5B,SAAS,WAAW;AAAA,IACpB,gBAAgB;AAAA,IAChB;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,WAAW;AAAA,EACtB;AACF;AAIA,SAAS,2BAA2B;AAElC,SAAO,iBAAiB,SAAS,CAAC,UAAU;AAE1C,UAAM,SAAS,MAAM;AACrB,QAAI,UAAU,OAAO,WAAW,CAAC,OAAO,UAAU,QAAQ,SAAS,OAAO,EAAE,SAAS,OAAO,OAAO,GAAG;AACpG,YAAM,MAAO,OAAe,OAAQ,OAAe,QAAQ;AAC3D,cAAQ,kBAAkB,EAAE,MAAM,iBAAiB,SAAS,GAAG,OAAO,OAAO,oBAAoB,GAAG,IAAI,OAAO,GAAG,GAAG,UAAU,CAAC;AAChI;AAAA,IACF;AAEA,UAAM,MAAO,MAAqB,SAAS;AAAA,MACzC,MAAM;AAAA,MACN,SAAU,MAAqB;AAAA,MAC/B,OAAO,MAAO,MAAqB,QAAQ,IAAK,MAAqB,MAAM,IAAK,MAAqB,KAAK;AAAA,IAC5G;AACA,YAAQ,kBAAkB,KAAK,QAAQ,CAAC;AAAA,EAC1C,GAAG,IAAI;AAGP,SAAO,iBAAiB,sBAAsB,CAAC,UAAU;AACvD,UAAM,MAAM,MAAM,kBAAkB,QAChC,MAAM,SACN,EAAE,MAAM,sBAAsB,SAAS,OAAO,MAAM,UAAU,6BAA6B,GAAG,OAAO,GAAG;AAC5G,YAAQ,kBAAkB,KAAK,oBAAoB,CAAC;AAAA,EACtD,CAAC;AAGD,QAAM,gBAAgB,OAAO;AAC7B,SAAO,QAAQ,kBAAmB,MAAmD;AACnF,UAAM,MAAM,OAAO,KAAK,CAAC,MAAM,WAC3B,KAAK,CAAC,IACN,KAAK,CAAC,aAAa,MACnB,KAAK,CAAC,EAAE,SAAS,IAChB,KAAK,CAAC,GAAe,OAAO;AAGjC,QAAI,IAAI,SAAS,iBAAiB;AAAG,aAAO,cAAc,GAAG,IAAI;AAEjE,QAAI;AACF,YAAM,WAAW,MAAM,cAAc,GAAG,IAAI;AAC5C,UAAI,CAAC,SAAS,IAAI;AAChB,gBAAQ,kBAAkB;AAAA,UACxB,MAAM,QAAQ,SAAS,MAAM;AAAA,UAC7B,SAAS,QAAQ,SAAS,MAAM,KAAM,KAAK,CAAC,GAAmB,UAAU,KAAK,IAAI,GAAG;AAAA,UACrF,OAAO,GAAI,KAAK,CAAC,GAAmB,UAAU,KAAK,IAAI,GAAG,WAAM,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,UACtG,QAAQ,SAAS;AAAA,QACnB,GAAG,OAAO,CAAC;AAAA,MACb;AACA,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,cAAQ,kBAAkB;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,iBAAkB,KAAK,CAAC,GAAmB,UAAU,KAAK,IAAI,GAAG,WAAM,IAAI,OAAO;AAAA,QAC3F,OAAO,IAAI;AAAA,MACb,GAAG,OAAO,CAAC;AACX,YAAM;AAAA,IACR;AAAA,EACF;AAGA,QAAM,eAAe,eAAe,UAAU;AAC9C,QAAM,eAAe,eAAe,UAAU;AAE9C,iBAAe,UAAU,OAAO,SAAU,QAAgB,QAAgB,MAAa;AACrF,IAAC,KAAa,YAAY;AAC1B,IAAC,KAAa,SAAS;AACvB,WAAO,aAAa,KAAK,MAAM,QAAQ,KAAK,GAAG,IAAI;AAAA,EACrD;AAEA,iBAAe,UAAU,OAAO,YAAa,MAAa;AACxD,UAAM,MAAe,KAAa,UAAU;AAC5C,UAAM,SAAkB,KAAa,aAAa;AAElD,QAAI,CAAC,IAAI,SAAS,iBAAiB,GAAG;AACpC,WAAK,iBAAiB,WAAW,MAAM;AACrC,YAAI,KAAK,UAAU,OAAO,KAAK,WAAW,GAAG;AAC3C,kBAAQ,kBAAkB;AAAA,YACxB,MAAM,OAAO,KAAK,MAAM;AAAA,YACxB,SAAS,OAAO,KAAK,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,YAC7C,OAAO,GAAG,MAAM,IAAI,GAAG,WAAM,KAAK,MAAM,IAAI,KAAK,UAAU;AAAA,YAC3D,QAAQ,KAAK;AAAA,UACf,GAAG,KAAK,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,aAAa,MAAM,MAAM,IAAI;AAAA,EACtC;AAGA,SAAO,iBAAiB,gBAAgB,MAAM;AAC5C,QAAI;AACF,gBAAU;AAAA,QACR;AAAA,QACA,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,QAAQ,SAAS;AAAA,UACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,aAAa,eAAe;AAAA,UAC5B,KAAK,OAAO;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAAe;AAAA,EACzB,CAAC;AACH;AAIA,SAAS,0BAA0B;AACjC,UAAQ,GAAG,qBAAqB,CAAC,UAAiB;AAChD,YAAQ,kBAAkB,OAAO,mBAAmB,CAAC;AACrD,UAAM;AAAA,EACR,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,WAAgB;AAChD,YAAQ;AAAA,MACN,kBAAkB,QAAQ,SAAS,EAAE,MAAM,sBAAsB,SAAS,OAAO,MAAM,GAAG,OAAO,GAAG;AAAA,MACpG;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,WAAW,OAAO,WAAmB;AACzC,UAAM,QAAQ;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,MACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,aAAa,eAAe;AAAA,MAC5B,KAAK,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,GAAG,WAAW,MAAM,SAAS,SAAS,CAAC;AAC/C,UAAQ,GAAG,UAAU,MAAM,SAAS,QAAQ,CAAC;AAC/C;AAIO,IAAM,WAAW;AAAA,EACtB,KAAK,KAAa;AAChB,QAAI;AAAa;AACjB,QAAI,CAAC,KAAK;AAAQ;AAElB,cAAU;AACV,kBAAc;AAGd,kBAAc;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ,IAAI;AAAA,MACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,aAAa,eAAe;AAAA,MAC5B,KAAK,OAAO;AAAA,MACZ,SAAS,WAAW;AAAA,IACtB,CAAC;AAGD,QAAI,OAAO,WAAW,aAAa;AACjC,+BAAyB;AAAA,IAC3B,WAAW,OAAO,YAAY,eAAe,QAAQ,UAAU,MAAM;AACnE,8BAAwB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,QAAQ,OAAgB;AACtB,QAAI,CAAC;AAAa;AAClB,UAAM,MAAM,iBAAiB,QACzB,QACA,EAAE,MAAM,iBAAiB,SAAS,OAAO,KAAK,GAAG,OAAO,IAAI,MAAM,EAAE,MAAM;AAC9E,YAAQ,kBAAkB,KAAK,QAAQ,CAAC;AAAA,EAC1C;AAAA,EAEA,eAAe,SAAiB;AAC9B,QAAI,CAAC;AAAa;AAClB,YAAQ,kBAAkB,EAAE,MAAM,WAAW,SAAS,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EAC9E;AAAA,EAEA,eAAe;AACb,WAAO,SAAU,KAAU,MAAW,MAAW,MAAW;AAC1D,cAAQ,kBAAkB,KAAK,SAAS,CAAC;AACzC,WAAK,GAAG;AAAA,IACV;AAAA,EACF;AACF;AAEA,IAAO,cAAQ;",
6
6
  "names": []
7
7
  }