import { defineCodes, SuaveplanError } from "@suaveplan/error"; /** * Stable error-code registry for `@suaveplan/api-router`. * * Codes follow the `ROUTER.` namespace as resolved by * `@suaveplan/error`'s `defineCodes`. Every code in the registry MUST be * thrown by a production path in this package — the spec-conformance test * enumerates the registry and verifies each entry has a production throw * site. */ export const ROUTER_CODES = defineCodes("ROUTER", [ "ROUTE_COLLISION", "INVALID_PREFIX", "MIDDLEWARE_INSERTION_DENIED", "SLOT_FLIP_FAILED", "SLOT_DISPOSE_TIMEOUT", ] as const); /** Union of every code resolved through {@link ROUTER_CODES}. */ export type RouterCode = (typeof ROUTER_CODES)[keyof typeof ROUTER_CODES]; /** * Typed error for every `@suaveplan/api-router` failure. * * Extends `SuaveplanError` so callers can discriminate errors from this * package via `error instanceof RouterError` or the stable `error.code` * property. The `context` slot carries call-site metadata * (matched route, plugin id, slot id, etc.) without leaking internals. */ export class RouterError extends SuaveplanError { public constructor( code: RouterCode, message: string, options?: { cause?: Error; context?: Record } ) { super(code, message, options); this.name = "RouterError"; } }