import * as tm from "type-mapping"; import {RouteData, Route} from "../route"; import {PathUtil} from "../../path"; export type AppendParamField = ( Route<{ readonly method : DataT["method"]; readonly path : PathUtil.AppendParam>; readonly param : ( DataT["param"] extends undefined ? tm.ObjectFromArrayMapper<[FieldT]> : DataT["param"] extends tm.AnySafeMapper ? tm.DeepMergeMapper< DataT["param"], [tm.ObjectFromArrayMapper<[FieldT]>] > : never ); readonly query : DataT["query"]; readonly body : DataT["body"]; readonly header : DataT["header"]; readonly response : DataT["response"]; }> ); export type AssertValidParamField = ( Extract, string> extends never ? [ "Field maps", tm.MappableInputOf, "but must be able to also map", string ] : FieldT ); export function appendParamField< DataT extends RouteData, FieldT extends tm.AnyField > ( data : DataT, field : AssertValidParamField, regex? : RegExp ) : AppendParamField { const curPath = (data as DataT).path as DataT["path"]; return new Route<{ readonly method : DataT["method"]; readonly path : PathUtil.AppendParam>; readonly param : ( DataT["param"] extends undefined ? tm.ObjectFromArrayMapper<[FieldT]> : DataT["param"] extends tm.AnySafeMapper ? tm.DeepMergeMapper< DataT["param"], [tm.ObjectFromArrayMapper<[FieldT]>] > : never ); readonly query : DataT["query"]; readonly body : DataT["body"]; readonly header : DataT["header"]; readonly response : DataT["response"]; }>({ ...(data as DataT), path : curPath.appendParam>(tm.getNameOrEmptyString(field as FieldT), regex), param : ( data.param == undefined ? tm.objectFromArray(field as FieldT) : tm.deepMerge(data.param, tm.objectFromArray(field as FieldT)) ) as any, }); }