mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 15:11:13 -05:00
Connect to Lovable Cloud
Add centralized errorFormatter to convert various error types into readable messages, and apply it across edge functions. Replace String(error) usage with formatEdgeError, update relevant imports, fix a throw to use toError, and enhance logger to log formatted errors. Includes new errorFormatter.ts and widespread updates to 18+ edge functions plus logger integration.
This commit is contained in:
94
supabase/functions/_shared/errorFormatter.ts
Normal file
94
supabase/functions/_shared/errorFormatter.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* Error Formatting Utility for Edge Functions
|
||||
*
|
||||
* Provides robust error message extraction from various error types:
|
||||
* - Standard Error objects
|
||||
* - Supabase PostgresError objects (plain objects with message/details/code/hint)
|
||||
* - Raw objects and primitives
|
||||
*
|
||||
* Eliminates "[object Object]" errors by properly extracting error details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Format error objects for logging
|
||||
* Handles Error objects, Supabase errors (plain objects), and primitives
|
||||
*
|
||||
* @param error - Any error value
|
||||
* @returns Formatted, human-readable error message string
|
||||
*/
|
||||
export function formatEdgeError(error: unknown): string {
|
||||
// Standard Error objects
|
||||
if (error instanceof Error) {
|
||||
return error.message;
|
||||
}
|
||||
|
||||
// Object-like errors (Supabase PostgresError, etc.)
|
||||
if (typeof error === 'object' && error !== null) {
|
||||
const err = error as any;
|
||||
|
||||
// Try common error message properties
|
||||
if (err.message && typeof err.message === 'string') {
|
||||
// Include additional Supabase error details if present
|
||||
const parts: string[] = [err.message];
|
||||
|
||||
if (err.details && typeof err.details === 'string') {
|
||||
parts.push(`Details: ${err.details}`);
|
||||
}
|
||||
|
||||
if (err.hint && typeof err.hint === 'string') {
|
||||
parts.push(`Hint: ${err.hint}`);
|
||||
}
|
||||
|
||||
if (err.code && typeof err.code === 'string') {
|
||||
parts.push(`Code: ${err.code}`);
|
||||
}
|
||||
|
||||
return parts.join(' | ');
|
||||
}
|
||||
|
||||
// Some errors nest the actual error in an 'error' property
|
||||
if (err.error) {
|
||||
return formatEdgeError(err.error);
|
||||
}
|
||||
|
||||
// Some APIs use 'msg' instead of 'message'
|
||||
if (err.msg && typeof err.msg === 'string') {
|
||||
return err.msg;
|
||||
}
|
||||
|
||||
// Last resort: stringify the entire object
|
||||
try {
|
||||
const stringified = JSON.stringify(error, null, 2);
|
||||
return stringified.length > 500
|
||||
? stringified.substring(0, 500) + '... (truncated)'
|
||||
: stringified;
|
||||
} catch {
|
||||
// JSON.stringify can fail on circular references
|
||||
return 'Unknown error (could not stringify)';
|
||||
}
|
||||
}
|
||||
|
||||
// Primitive values (strings, numbers, etc.)
|
||||
return String(error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert any error to a proper Error instance
|
||||
* Use this before throwing to ensure proper stack traces
|
||||
*
|
||||
* @param error - Any error value
|
||||
* @returns Error instance with formatted message
|
||||
*/
|
||||
export function toError(error: unknown): Error {
|
||||
if (error instanceof Error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
const message = formatEdgeError(error);
|
||||
const newError = new Error(message);
|
||||
|
||||
// Preserve original error as property for debugging
|
||||
(newError as any).originalError = error;
|
||||
|
||||
return newError;
|
||||
}
|
||||
Reference in New Issue
Block a user