{"version":3,"file":"resolvers.mjs","sources":["../src/resolvers.ts"],"sourcesContent":["import { type HTTPErrorResponse, mergeHeaders } from '@md-oss/common/http';\nimport { UrlUtils } from '@md-oss/common/utils';\nimport { parseJson, stringifyJson } from '@md-oss/serdes';\nimport type { HttpRequestOptions, QueryValue } from './types';\n\nconst resolvePathParams = (\n\tpath: string,\n\tpathParams?: Record<string, string | number>\n): string => {\n\tif (!pathParams) return path;\n\treturn path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, key) => {\n\t\tconst value = pathParams[key];\n\t\tif (value === undefined || value === null) {\n\t\t\tthrow new Error(`Missing path parameter: ${key}`);\n\t\t}\n\t\treturn encodeURIComponent(String(value));\n\t});\n};\n\nconst buildUrl = (baseUrl: string, path: string | null) =>\n\tUrlUtils.createUrlBuilder(baseUrl)(path ?? '');\n\nconst appendQuery = (\n\turl: string,\n\tquery?: Record<string, QueryValue> | URLSearchParams\n): string => {\n\tif (!query) return url;\n\n\tconst [path, existing = ''] = url.split('?');\n\tconst params = new URLSearchParams(existing);\n\n\tif (query instanceof URLSearchParams) {\n\t\tfor (const [key, value] of query.entries()) {\n\t\t\tparams.append(key, value);\n\t\t}\n\t} else {\n\t\tfor (const [key, raw] of Object.entries(query)) {\n\t\t\tif (raw == null) continue;\n\n\t\t\tif (Array.isArray(raw)) {\n\t\t\t\tfor (const item of raw) {\n\t\t\t\t\tif (item == null) continue;\n\t\t\t\t\tparams.append(key, String(item));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tparams.append(key, String(raw));\n\t\t\t}\n\t\t}\n\t}\n\n\tconst qs = params.toString();\n\treturn qs ? `${path}?${qs}` : path ? path : url;\n};\n\nconst isBinaryBody = (\n\tbody: unknown\n): body is Blob | ArrayBuffer | ArrayBufferView => {\n\treturn (\n\t\tbody instanceof Blob ||\n\t\tbody instanceof ArrayBuffer ||\n\t\tArrayBuffer.isView(body)\n\t);\n};\n\nconst isJsonBody = (body: unknown) => {\n\tif (body == null) return false;\n\treturn !(\n\t\ttypeof body === 'string' ||\n\t\tbody instanceof FormData ||\n\t\tbody instanceof URLSearchParams ||\n\t\tisBinaryBody(body)\n\t);\n};\n\nconst toBody = (body: unknown): BodyInit | undefined => {\n\tif (body == null) return undefined;\n\tif (\n\t\ttypeof body === 'string' ||\n\t\tbody instanceof FormData ||\n\t\tbody instanceof URLSearchParams ||\n\t\tisBinaryBody(body)\n\t) {\n\t\treturn body as BodyInit;\n\t}\n\treturn stringifyJson(body);\n};\n\nconst resolveRequestHeaders = (\n\theaders: HeadersInit | undefined,\n\tbody: unknown,\n\tparseAs: HttpRequestOptions['parseAs']\n): Headers => {\n\tconst resolved = mergeHeaders(headers);\n\n\tresolved.delete('content-length');\n\n\tif (parseAs === 'json' && !resolved.has('accept')) {\n\t\tresolved.set('accept', 'application/json');\n\t}\n\n\tif (isJsonBody(body) && !resolved.has('content-type')) {\n\t\tresolved.set('content-type', 'application/json');\n\t}\n\n\treturn resolved;\n};\n\nconst isErrorDetails = (\n\tvalue: unknown\n): value is HTTPErrorResponse['details'] => {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n};\n\nconst parseErrorResponse = async (\n\tresponse: Response,\n\tfallback: string\n): Promise<Pick<HTTPErrorResponse, 'code' | 'message' | 'details'>> => {\n\ttry {\n\t\tconst text = await response.clone().text();\n\t\tif (!text) {\n\t\t\treturn {\n\t\t\t\tcode: 'API_ERROR',\n\t\t\t\tmessage: fallback,\n\t\t\t\tdetails: null,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst parsed = parseJson<Record<string, unknown>>(text);\n\t\t\treturn {\n\t\t\t\tcode: typeof parsed?.code === 'string' ? parsed.code : 'API_ERROR',\n\t\t\t\tmessage:\n\t\t\t\t\ttypeof parsed?.message === 'string'\n\t\t\t\t\t\t? parsed.message\n\t\t\t\t\t\t: typeof parsed?.error === 'string'\n\t\t\t\t\t\t\t? parsed.error\n\t\t\t\t\t\t\t: fallback,\n\t\t\t\tdetails: isErrorDetails(parsed?.details) ? parsed.details : null,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tcode: 'API_ERROR',\n\t\t\t\tmessage: text,\n\t\t\t\tdetails: null,\n\t\t\t};\n\t\t}\n\t} catch {\n\t\treturn {\n\t\t\tcode: 'API_ERROR',\n\t\t\tmessage: fallback,\n\t\t\tdetails: null,\n\t\t};\n\t}\n};\n\nexport {\n\tappendQuery,\n\tbuildUrl,\n\tparseErrorResponse,\n\tresolvePathParams,\n\tresolveRequestHeaders,\n\ttoBody,\n};\n"],"names":["resolvePathParams","__name","path","pathParams","_","key","value","buildUrl","baseUrl","UrlUtils","appendQuery","url","query","existing","params","raw","item","qs","isBinaryBody","body","isJsonBody","toBody","stringifyJson","resolveRequestHeaders","headers","parseAs","resolved","mergeHeaders","isErrorDetails","parseErrorResponse","response","fallback","text","parsed","parseJson"],"mappings":"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"}