{"version":3,"file":"main.mjs","names":[],"sources":["../../../typescript-common-runtime/dist/esm/request-bodies/url-search-params.mjs","../../src/main.ts"],"sourcesContent":["//#region src/request-bodies/url-search-params.ts\nfunction getEncoding(key, encoding) {\n\treturn {\n\t\tstyle: \"form\",\n\t\texplode: true,\n\t\tallowReserved: false,\n\t\t...encoding[key]\n\t};\n}\nconst separators = {\n\tdeepObject: \",\",\n\tform: \",\",\n\tpipeDelimited: \"|\",\n\tspaceDelimited: \" \"\n};\nfunction addArrayValue(result, key, value, encoding) {\n\tif (encoding.style === \"deepObject\" && encoding.explode) return addObjectValue(result, key, value, encoding);\n\tif (encoding.explode) for (const it of value) result.append(key, String(it));\n\telse result.append(key, value.join(separators[encoding.style]));\n}\nfunction addObjectValue(result, key, value, encoding) {\n\tif (encoding.explode) if (encoding.style === \"deepObject\") for (const it of Object.entries(value)) {\n\t\tconst path = `${key}[${it[0]}]`;\n\t\tconst value = it[1];\n\t\tif (typeof value === \"object\") addObjectValue(result, path, value, encoding);\n\t\telse result.append(path, String(value));\n\t}\n\telse for (const it of Object.entries(value)) result.append(it[0], String(it[1]));\n\telse if ([\n\t\t\"form\",\n\t\t\"spaceDelimited\",\n\t\t\"pipeDelimited\"\n\t].includes(encoding.style)) {\n\t\tconst sep = separators[encoding.style];\n\t\tresult.append(key, Object.entries(value).map((entry) => [entry[0], typeof entry[1] === \"object\" ? JSON.stringify(entry[1]) : entry[1]].join(sep)).join(sep));\n\t} else result.append(key, JSON.stringify(value));\n}\n/**\n* Serializes a request body as `application/x-www-form-urlencoded` with the exact\n* semantics defined by the provided encodings, falling back to the default encoding\n* specified by the OAI specification.\n*/\nfunction requestBodyToUrlSearchParams(obj, encodings = {}) {\n\tconst result = new URLSearchParams();\n\tfor (const [key, value] of Object.entries(obj)) {\n\t\tconst encoding = getEncoding(key, encodings);\n\t\tif (value === void 0 || value === null) continue;\n\t\tif (typeof value === \"object\") if (Array.isArray(value)) addArrayValue(result, key, value, encoding);\n\t\telse addObjectValue(result, key, value, encoding);\n\t\telse result.append(key, String(value));\n\t}\n\treturn result;\n}\n//#endregion\nexport { requestBodyToUrlSearchParams };\n\n//# sourceMappingURL=url-search-params.mjs.map","import {\n  type Encoding,\n  requestBodyToUrlSearchParams,\n} from \"@nahkies/typescript-common-runtime/request-bodies/url-search-params\"\nimport type {\n  HeaderParams,\n  QueryParams,\n} from \"@nahkies/typescript-common-runtime/types\"\nimport axios, {\n  AxiosHeaders,\n  type AxiosInstance,\n  type AxiosRequestConfig,\n  type AxiosResponse,\n  type RawAxiosRequestHeaders,\n} from \"axios\"\n\nexport type {\n  HeaderParams,\n  QueryParams,\n  Server,\n} from \"@nahkies/typescript-common-runtime/types\"\n\nexport interface AbstractAxiosConfig {\n  axios?: AxiosInstance | undefined\n  basePath: string\n  defaultHeaders?: Record<string, string> | undefined\n  defaultTimeout?: number | undefined\n}\n\nexport abstract class AbstractAxiosClient {\n  protected readonly axios: AxiosInstance\n  protected readonly basePath: string\n  protected readonly defaultHeaders: Record<string, string>\n  protected readonly defaultTimeout: number | undefined\n\n  protected constructor(config: AbstractAxiosConfig) {\n    this.axios = config.axios ?? axios\n    this.basePath = config.basePath\n    this.defaultHeaders = config.defaultHeaders ?? {}\n    this.defaultTimeout = config.defaultTimeout\n  }\n\n  protected _request<R extends AxiosResponse>(\n    opts: AxiosRequestConfig,\n  ): Promise<R> {\n    const headers = opts.headers ?? this._headers()\n    const timeout = opts.timeout ?? this.defaultTimeout\n\n    return this.axios.request({\n      baseURL: this.basePath,\n      ...opts,\n      ...(timeout !== undefined ? {timeout} : {}),\n      headers,\n    })\n  }\n\n  protected _query(\n    params: QueryParams,\n    encodings?: Record<string, Encoding>,\n  ): string {\n    const urlSearchParams = requestBodyToUrlSearchParams(params, encodings)\n    const asString = urlSearchParams.toString()\n\n    if (!asString.length) {\n      return \"\"\n    }\n\n    return `?${asString}`\n  }\n\n  /**\n   * Combines headers for a request, with precedence\n   * 1. default headers\n   * 2. route level header parameters\n   * 3. raw request config (escape hatch)\n   *\n   * following these rules:\n   * - header values of `undefined` are skipped\n   * - header values of `null` will remove/delete any previously set headers\n   *\n   * Eg:\n   * Passing `Authorization: null` as a parameter, will clear out any\n   * default `Authorization` header.\n   *\n   * But passing `Authorization: undefined` as parameter will fallthrough\n   * to the default `Authorization` header.\n   *\n   * @param paramHeaders\n   * @param optsHeaders\n   * @protected\n   */\n  protected _headers(\n    paramHeaders: HeaderParams = {},\n    optsHeaders: AxiosRequestConfig[\"headers\"] = {},\n  ): RawAxiosRequestHeaders {\n    const headers = new AxiosHeaders()\n\n    // axios doesn't know how to append headers, so we just apply\n    // from the lowest priority to highest.\n\n    this.setHeaders(headers, this.defaultHeaders)\n    this.setHeaders(headers, paramHeaders)\n    this.setHeaders(headers, optsHeaders)\n\n    return headers\n  }\n\n  protected _requestBodyToUrlSearchParams(\n    obj: Record<string, unknown>,\n    encoding: Record<string, Encoding> = {},\n  ): URLSearchParams {\n    return requestBodyToUrlSearchParams(obj, encoding)\n  }\n\n  protected _parseBlobResponse(res: AxiosResponse) {\n    const contentType = res.headers[\"content-type\"]\n\n    return new Blob([res.data], {\n      type:\n        typeof contentType === \"string\"\n          ? contentType\n          : \"application/octet-stream\",\n    })\n  }\n\n  private setHeaders(\n    headers: Pick<Headers, \"set\" | \"delete\">,\n    headersInit: HeaderParams | AxiosRequestConfig[\"headers\"],\n  ) {\n    const headersArray = this.headersAsArray(headersInit)\n\n    for (const [headerName, headerValue] of headersArray) {\n      if (headerValue === null) {\n        headers.delete(headerName)\n      } else if (headerValue !== undefined) {\n        headers.set(headerName.toLowerCase(), headerValue.toString())\n      }\n    }\n  }\n\n  private headersAsArray(\n    headers: HeaderParams | AxiosRequestConfig[\"headers\"],\n  ): [string, string | number | boolean | undefined | null][] {\n    if (Array.isArray(headers)) {\n      return headers\n    }\n\n    if (headers instanceof Headers) {\n      const result: [string, string][] = []\n      headers.forEach((value, key) => {\n        result.push([key, value])\n      })\n      return result\n    }\n\n    if (headers && typeof headers === \"object\") {\n      return Object.entries(headers)\n    }\n\n    return []\n  }\n}\n"],"mappings":";;AACA,SAAS,YAAY,KAAK,UAAU;CACnC,OAAO;EACN,OAAO;EACP,SAAS;EACT,eAAe;EACf,GAAG,SAAS;CACb;AACD;AACA,MAAM,aAAa;CAClB,YAAY;CACZ,MAAM;CACN,eAAe;CACf,gBAAgB;AACjB;AACA,SAAS,cAAc,QAAQ,KAAK,OAAO,UAAU;CACpD,IAAI,SAAS,UAAU,gBAAgB,SAAS,SAAS,OAAO,eAAe,QAAQ,KAAK,OAAO,QAAQ;CAC3G,IAAI,SAAS,SAAS,KAAK,MAAM,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO,EAAE,CAAC;MACtE,OAAO,OAAO,KAAK,MAAM,KAAK,WAAW,SAAS,MAAM,CAAC;AAC/D;AACA,SAAS,eAAe,QAAQ,KAAK,OAAO,UAAU;CACrD,IAAI,SAAS,SAAS,IAAI,SAAS,UAAU,cAAc,KAAK,MAAM,MAAM,OAAO,QAAQ,KAAK,GAAG;EAClG,MAAM,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG;EAC7B,MAAM,QAAQ,GAAG;EACjB,IAAI,OAAO,UAAU,UAAU,eAAe,QAAQ,MAAM,OAAO,QAAQ;OACtE,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC;CACvC;MACK,KAAK,MAAM,MAAM,OAAO,QAAQ,KAAK,GAAG,OAAO,OAAO,GAAG,IAAI,OAAO,GAAG,EAAE,CAAC;MAC1E,IAAI;EACR;EACA;EACA;CACD,EAAE,SAAS,SAAS,KAAK,GAAG;EAC3B,MAAM,MAAM,WAAW,SAAS;EAChC,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,EAAE,KAAK,UAAU,CAAC,MAAM,IAAI,OAAO,MAAM,OAAO,WAAW,KAAK,UAAU,MAAM,EAAE,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;CAC5J,OAAO,OAAO,OAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AAChD;;;;;;AAMA,SAAS,6BAA6B,KAAK,YAAY,CAAC,GAAG;CAC1D,MAAM,SAAS,IAAI,gBAAgB;CACnC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;EAC/C,MAAM,WAAW,YAAY,KAAK,SAAS;EAC3C,IAAI,UAAU,KAAK,KAAK,UAAU,MAAM;EACxC,IAAI,OAAO,UAAU,UAAU,IAAI,MAAM,QAAQ,KAAK,GAAG,cAAc,QAAQ,KAAK,OAAO,QAAQ;OAC9F,eAAe,QAAQ,KAAK,OAAO,QAAQ;OAC3C,OAAO,OAAO,KAAK,OAAO,KAAK,CAAC;CACtC;CACA,OAAO;AACR;;;ACvBA,IAAsB,sBAAtB,MAA0C;CACxC;CACA;CACA;CACA;CAEA,YAAsB,QAA6B;EACjD,KAAK,QAAQ,OAAO,SAAS;EAC7B,KAAK,WAAW,OAAO;EACvB,KAAK,iBAAiB,OAAO,kBAAkB,CAAC;EAChD,KAAK,iBAAiB,OAAO;CAC/B;CAEA,SACE,MACY;EACZ,MAAM,UAAU,KAAK,WAAW,KAAK,SAAS;EAC9C,MAAM,UAAU,KAAK,WAAW,KAAK;EAErC,OAAO,KAAK,MAAM,QAAQ;GACxB,SAAS,KAAK;GACd,GAAG;GACH,GAAI,YAAY,KAAA,IAAY,EAAC,QAAO,IAAI,CAAC;GACzC;EACF,CAAC;CACH;CAEA,OACE,QACA,WACQ;EAER,MAAM,WADkB,6BAA6B,QAAQ,SAC9B,EAAE,SAAS;EAE1C,IAAI,CAAC,SAAS,QACZ,OAAO;EAGT,OAAO,IAAI;CACb;;;;;;;;;;;;;;;;;;;;;;CAuBA,SACE,eAA6B,CAAC,GAC9B,cAA6C,CAAC,GACtB;EACxB,MAAM,UAAU,IAAI,aAAa;EAKjC,KAAK,WAAW,SAAS,KAAK,cAAc;EAC5C,KAAK,WAAW,SAAS,YAAY;EACrC,KAAK,WAAW,SAAS,WAAW;EAEpC,OAAO;CACT;CAEA,8BACE,KACA,WAAqC,CAAC,GACrB;EACjB,OAAO,6BAA6B,KAAK,QAAQ;CACnD;CAEA,mBAA6B,KAAoB;EAC/C,MAAM,cAAc,IAAI,QAAQ;EAEhC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,GAAG,EAC1B,MACE,OAAO,gBAAgB,WACnB,cACA,2BACR,CAAC;CACH;CAEA,WACE,SACA,aACA;EACA,MAAM,eAAe,KAAK,eAAe,WAAW;EAEpD,KAAK,MAAM,CAAC,YAAY,gBAAgB,cACtC,IAAI,gBAAgB,MAClB,QAAQ,OAAO,UAAU;OACpB,IAAI,gBAAgB,KAAA,GACzB,QAAQ,IAAI,WAAW,YAAY,GAAG,YAAY,SAAS,CAAC;CAGlE;CAEA,eACE,SAC0D;EAC1D,IAAI,MAAM,QAAQ,OAAO,GACvB,OAAO;EAGT,IAAI,mBAAmB,SAAS;GAC9B,MAAM,SAA6B,CAAC;GACpC,QAAQ,SAAS,OAAO,QAAQ;IAC9B,OAAO,KAAK,CAAC,KAAK,KAAK,CAAC;GAC1B,CAAC;GACD,OAAO;EACT;EAEA,IAAI,WAAW,OAAO,YAAY,UAChC,OAAO,OAAO,QAAQ,OAAO;EAG/B,OAAO,CAAC;CACV;AACF"}