import type { VextClientContract, VextClientRouteContract, VextRouteSchemaContractV1 } from "../contract/types.js"; export interface RoutesManifestPayload { routes?: Array<{ method?: string; path?: string; routeId?: string; operationId?: string; source?: string; docsKind?: "backend-api" | "frontend-route"; docsSummary?: string | null; tags?: string[]; hidden?: boolean; schema?: VextRouteSchemaContractV1; freshness?: VextClientRouteContract["freshness"]; layout?: VextClientRouteContract["layout"]; }>; } export interface WriteClientContractOptions { rootDir: string; outDir: string; routeManifestPath?: string; } export interface WriteClientContractResult { contractPath: string; routeContractPath: string; modulePath: string; routeCount: number; warnings: readonly string[]; } export declare function writeClientContractFromRouteManifest(options: WriteClientContractOptions): Promise; export declare function buildClientContract(payload: RoutesManifestPayload): VextClientContract; /** * Rejects a generated client contract when it no longer represents the route * manifest that produced it. This remains in the tooling layer deliberately: * browser clients consume the already-generated contract and must not pull in * Node's hashing implementation just to make a request. */ export declare function assertClientContractMatchesRouteManifest(contract: VextClientContract, payload: RoutesManifestPayload): void;