import * as tm from "type-mapping"; import {RouteData} from "../route"; import {ParamNameOf} from "../query"; /** For now, a `Route`'s validity is just determined by its path param parts and param mapper. */ export type IsValid = ( ParamNameOf extends never ? true : undefined extends DataT["param"] ? false : true ); export type NonStringMappableKeys = ( { [k in Extract, string>] : ( Extract[k], string> extends never ? k : never ) }[Extract, string>] ); /** For now, a `Route`'s validity is just determined by its path param parts and param mapper. */ export type AssertValid = ( ParamNameOf extends never ? DataT : DataT["param"] extends tm.AnySafeMapper ? ( NonStringMappableKeys extends never ? DataT : [ "These params must also map string", NonStringMappableKeys ] ) : [ "You must call .setParam() on the route declaration for params", ParamNameOf ] ); export function isValid (data : DataT) : IsValid { return ( !data.path.hasParamParts() || (data.param instanceof Function) ) as IsValid; } export function assertValid (data : RouteData) { if (!isValid(data)) { const paramNames = data.path .getParamParts() .map(p => p.name); throw new Error(`You must call .setParam() on the route declaration for params ${paramNames.join(",")}`); } }