59 lines
1.1 KiB
TypeScript
59 lines
1.1 KiB
TypeScript
// lib/errors.ts
|
|
export type ValidationIssue = {
|
|
path: string;
|
|
message: string;
|
|
};
|
|
|
|
export type AppError =
|
|
| {
|
|
type: 'validation';
|
|
message: string;
|
|
issues?: ValidationIssue[];
|
|
}
|
|
| {
|
|
type: 'not_found';
|
|
message: string;
|
|
}
|
|
| {
|
|
type: 'conflict';
|
|
message: string;
|
|
}
|
|
| {
|
|
type: 'unauthorized';
|
|
message: string;
|
|
}
|
|
| {
|
|
type: 'forbidden';
|
|
message: string;
|
|
}
|
|
| {
|
|
type: 'unexpected';
|
|
message: string;
|
|
};
|
|
|
|
export const Errors = {
|
|
validation(message: string, issues?: ValidationIssue[]): AppError {
|
|
return { type: 'validation', message, issues };
|
|
},
|
|
|
|
notFound(message = 'Resource not found'): AppError {
|
|
return { type: 'not_found', message };
|
|
},
|
|
|
|
conflict(message: string): AppError {
|
|
return { type: 'conflict', message };
|
|
},
|
|
|
|
unauthorized(message = 'Unauthorized'): AppError {
|
|
return { type: 'unauthorized', message };
|
|
},
|
|
|
|
forbidden(message = 'Forbidden'): AppError {
|
|
return { type: 'forbidden', message };
|
|
},
|
|
|
|
unexpected(message = 'Unexpected error'): AppError {
|
|
return { type: 'unexpected', message };
|
|
},
|
|
};
|