59 lines
1.7 KiB
TypeScript
59 lines
1.7 KiB
TypeScript
type LovableErrorOptions = {
|
|||
|
|
mechanism?: "manual" | "onerror" | "unhandledrejection" | "react_error_boundary";
|
||
|
|
handled?: boolean;
|
||
|
|
severity?: "error" | "warning" | "info";
|
||
|
|
};
|
||
|
|
|
||
|
|
type LovableEvents = {
|
||
|
|
captureException?: (
|
||
|
|
error: unknown,
|
||
|
|
context?: Record<string, unknown>,
|
||
|
|
options?: LovableErrorOptions,
|
||
|
|
) => void;
|
||
|
|
};
|
||
|
|
|
||
|
|
declare global {
|
||
|
|
interface Window {
|
||
|
|
__lovableEvents?: LovableEvents;
|
||
|
|
__lovableReportRuntimeError?: (payload: {
|
||
|
|
message: string;
|
||
|
|
stack?: string;
|
||
|
|
filename?: string;
|
||
|
|
}) => void;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function reportLovableError(error: unknown, context: Record<string, unknown> = {}) {
|
||
|
|
if (typeof window === "undefined") return;
|
||
|
|
window.__lovableEvents?.captureException?.(
|
||
|
|
error,
|
||
|
|
{
|
||
|
|
source: "react_error_boundary",
|
||
|
|
route: window.location.pathname,
|
||
|
|
...context,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
mechanism: "react_error_boundary",
|
||
|
|
handled: false,
|
||
|
|
severity: "error",
|
||
|
|
},
|
||
|
|
);
|
||
|
|
// Prod React does not rethrow boundary-caught errors to window.onerror, so the
|
||
|
|
// editor's telemetry never sees them. Forward to lovable.js's reporting hook,
|
||
|
|
// which is present only inside the editor preview.
|
||
|
|
// Loaders and server fns commonly throw a raw Response; String(it) is the
|
||
|
|
// opaque "[object Response]", so pull out the status and URL instead.
|
||
|
|
const message =
|
||
|
|
error instanceof Response
|
||
|
|
? `Response ${error.status}${error.url ? ` at ${error.url}` : ""}`
|
||
|
|
: error instanceof Error
|
||
|
|
? error.message
|
||
|
|
: String(error);
|
||
|
|
const stack = error instanceof Error ? error.stack : undefined;
|
||
|
|
window.__lovableReportRuntimeError?.({
|
||
|
|
message,
|
||
|
|
...(stack !== undefined && { stack }),
|
||
|
|
filename: window.location.pathname,
|
||
|
|
});
|
||
|
|
}
|