From 27ec24eb4b9af0219257637de60ca5ea100f5ada Mon Sep 17 00:00:00 2001 From: Lucas Winther Date: Fri, 30 Oct 2026 15:30:49 +0100 Subject: [PATCH] feat(core): shared domain error classes Co-Authored-By: Claude Opus 5.5 --- packages/core/src/errors.ts | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 packages/core/src/errors.ts diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts new file mode 100644 index 0000000..8e70526 --- /dev/null +++ b/packages/core/src/errors.ts @@ -0,0 +1,42 @@ +/** Authentication or authorisation failure; `code` names the reason (e.g. "invalid_credentials"). */ +export class AuthError extends Error { + override readonly name = "AuthError"; + constructor(readonly code: string) { + super(code); + } +} + +/** Input rejected by validation. */ +export class ValidationError extends Error { + override readonly name = "ValidationError"; + readonly code = "validation"; + constructor( + readonly field: string, + readonly reason: string, + ) { + super(`${field}: ${reason}`); + } +} + +/** Encryption or decryption failure (e.g. wrong key, tampered ciphertext). */ +export class CryptoError extends Error { + override readonly name = "CryptoError"; + readonly code = "crypto"; +} + +/** Import or restore failure; `code` names the reason. */ +export class ImportError extends Error { + override readonly name = "ImportError"; + constructor(readonly code: string) { + super(code); + } +} + +/** A requested record does not exist (or is not visible to the caller). */ +export class NotFoundError extends Error { + override readonly name = "NotFoundError"; + readonly code = "not_found"; + constructor(readonly what: string) { + super(`${what} not found`); + } +}