{"version":3,"file":"requestFn.cjs","sources":["../../../src/lib/requestFn.ts"],"sourcesContent":["import type {\n  HeadersOptions,\n  OperationSchema,\n  RequestFnInfo,\n  RequestFnOptions,\n  RequestFnResponse,\n} from '@openapi-qraft/tanstack-query-react-types';\nimport { processResponse, resolveResponse } from './responseUtils.js';\n\n/**\n * This function is used to make a request to a specified endpoint.\n *\n * @template T The expected return type of the request.\n *\n * @param schema The schema of the operation to be performed. It includes the OpenAPI path, HTTP method and media type.\n * @param requestInfo The information required to make the request. It includes parameters, headers, body, etc.\n * @param [options] Optional. Additional options for the request. It includes custom urlSerializer, bodySerializer, and fetch function.\n *\n * @returns {Promise<T>} Returns a promise that resolves with the response of the request.\n *\n * @throws {error: object|string, response: Response} Throws an error if the request fails. The error includes the error message and the response from the server.\n */\nexport async function requestFn<TData, TError>(\n  schema: OperationSchema,\n  requestInfo: RequestFnInfo,\n  options?: RequestFnOptions\n): Promise<RequestFnResponse<TData, TError>> {\n  return baseRequestFn<TData, TError>(schema, requestInfo, {\n    urlSerializer,\n    bodySerializer,\n    ...options,\n  });\n}\n\n/**\n * This function is used to make a request to a specified endpoint.\n * It's necessary to create a custom `requestFn` with a custom `urlSerializer`\n * and `bodySerializer`, with the tree-shaking of the default `requestFn`\n * and its serializers.\n *\n * @template T The expected return type of the request.\n *\n * @param requestSchema The schema of the operation to be performed. It includes the OpenAPI path, HTTP method and media type.\n * @param requestInfo The information required to make the request. It includes parameters, headers, body, etc.\n * @param options The options for the request. It includes urlSerializer, bodySerializer, and fetch function. The 'urlSerializer' and 'bodySerializer' are required.\n *\n * @returns {Promise<T>} Returns a promise that resolves with the response of the request.\n *\n * @throws {error: object|string, response: Response} Throws an error if the request fails. The error includes the error message and the response from the server.\n */\nexport async function baseRequestFn<TData, TError>(\n  requestSchema: OperationSchema,\n  requestInfo: RequestFnInfo,\n  options: WithRequired<RequestFnOptions, 'urlSerializer' | 'bodySerializer'>\n): Promise<RequestFnResponse<TData, TError>> {\n  const { parameters, headers, body, ...requestInfoRest } = requestInfo;\n\n  const requestPayload = options.bodySerializer(requestSchema, body);\n\n  const baseFetch = options.fetch ?? fetch;\n\n  return baseFetch(options.urlSerializer(requestSchema, requestInfo), {\n    method: requestSchema.method.toUpperCase(),\n    body: requestPayload?.body,\n    headers: mergeHeaders(\n      { Accept: 'application/json' },\n      requestPayload?.headers,\n      headers,\n      parameters?.header\n    ),\n    ...requestInfoRest,\n  })\n    .then(processResponse as typeof processResponse<TData, TError>)\n    .catch(resolveResponse as typeof resolveResponse<TData, TError>);\n}\n\n/**\n * Serializes the given schema and request payload into a URL string.\n *\n * This function is implemented according to the URI Template standard\n * defined in RFC 6570. It supports the expansion of path and query parameters,\n * correctly handling empty arrays, `null`, and `undefined` values by ignoring\n * them during the expansion process, as specified by the standard.\n *\n * For more information, refer to the official documentation:\n * https://datatracker.ietf.org/doc/html/rfc6570\n *\n * @param schema - The operation schema containing the URL template and method.\n * @param info - The request payload including baseUrl, path parameters, and query parameters.\n * @returns The fully constructed URL string.\n */\nexport function urlSerializer(\n  schema: OperationSchema,\n  info: Pick<RequestFnInfo, 'baseUrl' | 'parameters'>\n): string {\n  const path = schema.url.replace(\n    /{(.*?)}/g,\n    (substring: string, group: string) => {\n      if (\n        info.parameters?.path &&\n        Object.prototype.hasOwnProperty.call(info.parameters.path, group)\n      ) {\n        return encodeURIComponent(String(info.parameters?.path[group]));\n      }\n      return substring;\n    }\n  );\n\n  const baseUrl = info.baseUrl ?? '';\n\n  if (info.parameters?.query) {\n    return `${baseUrl}${path}${getQueryString(info.parameters.query)}`;\n  }\n\n  return `${baseUrl}${path}`;\n}\n\nfunction getQueryString(params: Record<string, any>): string {\n  const search = new URLSearchParams();\n\n  const walk = (prefix: string, value: any) => {\n    if (value == null) return;\n    if (value instanceof Date)\n      return search.append(prefix, value.toISOString());\n    if (Array.isArray(value)) return value.forEach((v) => walk(prefix, v));\n    if (typeof value === 'object') {\n      return Object.entries(value).forEach(([k, v]) =>\n        walk(`${prefix}[${k}]`, v)\n      );\n    }\n    search.append(prefix, String(value));\n  };\n\n  Object.entries(params).forEach(([k, v]) => walk(k, v));\n\n  const searchString = search.toString();\n\n  return searchString ? `?${searchString}` : '';\n}\n\nexport function mergeHeaders(...allHeaders: (HeadersOptions | undefined)[]) {\n  const headers = new Headers();\n\n  for (const headerSet of allHeaders) {\n    if (!headerSet || typeof headerSet !== 'object') {\n      continue;\n    }\n\n    const headersIterator =\n      headerSet instanceof Headers\n        ? headerSet.entries()\n        : Object.entries(headerSet);\n\n    for (const [headerKey, headerValue] of headersIterator) {\n      if (headerValue === null) {\n        headers.delete(headerKey);\n      } else if (headerValue !== undefined) {\n        headers.set(headerKey, headerValue);\n      }\n    }\n  }\n\n  return headers;\n}\n\nexport function bodySerializer(\n  schema: OperationSchema,\n  body: RequestFnInfo['body']\n) {\n  if (isReadOnlyOperation(schema)) return undefined;\n\n  if (body === undefined || body === null) return undefined;\n\n  if (typeof body === 'string') {\n    return {\n      body,\n      headers: {\n        'Content-Type':\n          // prefer text/* media type\n          schema.mediaType?.find((mediaType) => mediaType.includes('text/')) ??\n          // prefer JSON media type, assume that body is serialized as JSON\n          schema.mediaType?.find((mediaType) => mediaType.includes('/json')) ??\n          'text/plain',\n      },\n    };\n  }\n\n  if (body instanceof FormData) {\n    return {\n      body,\n      headers: {\n        // remove `Content-Type` if the serialized body is FormData;\n        // the browser will correctly set Content-Type & boundary expression\n        'Content-Type': null,\n      },\n    };\n  }\n\n  if (body instanceof Blob) {\n    return {\n      body,\n      headers: {\n        'Content-Type':\n          body.type ||\n          schema.mediaType?.find(\n            (mediaType) =>\n              !(\n                mediaType.includes('text/') &&\n                mediaType.includes('/form-data') &&\n                mediaType.includes('/json')\n              )\n          ) ||\n          'application/octet-stream',\n      },\n    };\n  }\n\n  let jsonMediaType: string | null = null;\n  let formDataMediaType: string | null = null;\n\n  if (schema.mediaType) {\n    for (let i = 0; i < schema.mediaType.length; i++) {\n      const mediaType = schema.mediaType[i];\n      if (mediaType.includes('/json')) jsonMediaType = mediaType;\n      else if (mediaType.includes('/form-data')) formDataMediaType = mediaType;\n    }\n  }\n\n  if (formDataMediaType) {\n    if (\n      !jsonMediaType ||\n      // Prefer FormData serialization if one of the fields is a Blob\n      Object.values(body).some((value) => value instanceof Blob)\n    ) {\n      return {\n        body: getRequestBodyFormData(body),\n        headers: {\n          // remove `Content-Type` if the serialized body is FormData;\n          // the browser will correctly set Content-Type & boundary expression\n          'Content-Type': null,\n        },\n      };\n    }\n  }\n\n  return {\n    body: JSON.stringify(body),\n    headers: {\n      'Content-Type': jsonMediaType ?? 'application/json',\n    },\n  };\n}\n\nfunction getRequestBodyFormData(\n  body: NonNullable<RequestFnInfo['body']>\n): FormData {\n  if (body instanceof FormData) return body;\n  if (typeof body !== 'object')\n    throw new Error(`Unsupported body type ${typeof body} in form-data.`);\n\n  const formData = new FormData();\n\n  const process = (key: string, value: any) => {\n    if (typeof value === 'string' || value instanceof Blob) {\n      formData.append(key, value);\n    } else {\n      formData.append(key, JSON.stringify(value));\n    }\n  };\n\n  Object.entries(body)\n    .filter(([_, value]) => typeof value !== 'undefined' && value !== null)\n    .forEach(([key, value]) => {\n      if (Array.isArray(value)) {\n        value.forEach((v) => process(key, v));\n      } else {\n        process(key, value);\n      }\n    });\n\n  return formData;\n}\n\ntype WithRequired<T, K extends keyof T> = T & {\n  [_ in K]: {};\n};\n\nexport type {\n  RequestFn,\n  RequestFnResponse,\n  HeadersOptions,\n  RequestFnOptions,\n  RequestFnInfo,\n  OperationSchema,\n} from '@openapi-qraft/tanstack-query-react-types';\n\n/**\n * @deprecated use `RequestFnInfo` instead\n */\nexport type RequestFnPayload = RequestFnInfo;\n\nfunction isReadOnlyOperation(operation: {\n  readonly method:\n    | 'get'\n    | 'put'\n    | 'post'\n    | 'patch'\n    | 'delete'\n    | 'options'\n    | 'head'\n    | 'trace';\n}) {\n  return (\n    operation.method === 'get' ||\n    operation.method === 'head' ||\n    operation.method === 'trace' ||\n    operation.method === 'options'\n  );\n}\n"],"names":["requestFn","schema","requestInfo","options","baseRequestFn","urlSerializer","bodySerializer","requestSchema","parameters","headers","body","requestInfoRest","requestPayload","baseFetch","fetch","method","toUpperCase","mergeHeaders","Accept","header","then","processResponse","catch","resolveResponse","info","path","url","replace","substring","group","Object","prototype","hasOwnProperty","call","encodeURIComponent","String","baseUrl","query","getQueryString","params","search","URLSearchParams","walk","prefix","value","Date","append","toISOString","Array","isArray","forEach","v","entries","k","searchString","toString","allHeaders","Headers","headerSet","headersIterator","headerKey","headerValue","delete","undefined","set","isReadOnlyOperation","mediaType","find","includes","FormData","Blob","type","jsonMediaType","formDataMediaType","i","length","values","some","getRequestBodyFormData","JSON","stringify","Error","formData","process","key","filter","_","operation"],"mappings":"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"}