// This file is auto-generated by @hey-api/openapi-ts type Slot = "body" | "headers" | "path" | "query"; export type Field = | { in: Exclude; /** * Field name. This is the name we want the user to see and use. */ key: string; /** * Field mapped name. This is the name we want to use in the request. * If omitted, we use the same value as `key`. */ map?: string; } | { in: Extract; /** * Key isn't required for bodies. */ key?: string; map?: string; } | { /** * Field name. This is the name we want the user to see and use. */ key: string; /** * Field mapped name. This is the name we want to use in the request. * If `in` is omitted, `map` aliases `key` to the transport layer. */ map: Slot; }; export interface Fields { allowExtra?: Partial>; args?: ReadonlyArray; } export type FieldsConfig = ReadonlyArray; const extraPrefixesMap: Record = { $body_: "body", $headers_: "headers", $path_: "path", $query_: "query", }; const extraPrefixes = Object.entries(extraPrefixesMap); type KeyMap = Map< string, | { in: Slot; map?: string; } | { in?: never; map: Slot; } >; const buildKeyMap = (fields: FieldsConfig, map?: KeyMap): KeyMap => { if (!map) { map = new Map(); } for (const config of fields) { if ("in" in config) { if (config.key) { map.set(config.key, { in: config.in, map: config.map, }); } } else if ("key" in config) { map.set(config.key, { map: config.map, }); } else if (config.args) { buildKeyMap(config.args, map); } } return map; }; interface Params { body: unknown; headers: Record; path: Record; query: Record; } const stripEmptySlots = (params: Params) => { for (const [slot, value] of Object.entries(params)) { if (value && typeof value === "object" && !Object.keys(value).length) { delete params[slot as Slot]; } } }; export const buildClientParams = (args: ReadonlyArray, fields: FieldsConfig) => { const params: Params = { body: {}, headers: {}, path: {}, query: {}, }; const map = buildKeyMap(fields); let config: FieldsConfig[number] | undefined; for (const [index, arg] of args.entries()) { if (fields[index]) { config = fields[index]; } if (!config) { continue; } if ("in" in config) { if (config.key) { const field = map.get(config.key)!; const name = field.map || config.key; if (field.in) { (params[field.in] as Record)[name] = arg; } } else { params.body = arg; } } else { for (const [key, value] of Object.entries(arg ?? {})) { const field = map.get(key); if (field) { if (field.in) { const name = field.map || key; (params[field.in] as Record)[name] = value; } else { params[field.map] = value; } } else { const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix)); if (extra) { const [prefix, slot] = extra; (params[slot] as Record)[key.slice(prefix.length)] = value; } else if ("allowExtra" in config && config.allowExtra) { for (const [slot, allowed] of Object.entries(config.allowExtra)) { if (allowed) { (params[slot as Slot] as Record)[key] = value; break; } } } } } } } stripEmptySlots(params); return params; };