import z from "zod/v4"; export abstract class NamedError extends Error { abstract schema(): z.core.$ZodType; abstract toObject(): { name: string; data: any }; static create(name: Name, data: Data) { const schema = z .object({ name: z.literal(name), data, }) .meta({ ref: name, }); const result = class extends NamedError { public static readonly Schema = schema; public override readonly name = name as Name; constructor( public readonly data: z.input, options?: ErrorOptions, ) { super(name, options); this.name = name; } static isInstance(input: any): input is InstanceType { return "name" in input && input.name === name; } schema() { return schema; } toObject() { return { name: name, data: this.data, }; } }; Object.defineProperty(result, "name", { value: name }); return result; } public static readonly Unknown = NamedError.create( "UnknownError", z.object({ message: z.string(), }), ); }