{"version":3,"file":"getApiMock.mjs","sources":[""],"sourcesContent":["import type { HttpResponseInit, JsonBodyType } from \"msw\";\r\nimport {\r\n  HttpResponse, HttpMethods, http, delay as wait,\r\n} from \"msw\";\r\nimport type { TContentTypes } from \"./contentTypes\";\r\nimport { contentTypes } from \"./contentTypes\";\r\nimport type { THttpHandlerWithExtendedInfo } from \"./httpHandler\";\r\nimport { ApiClient } from \"../../plugins/apiClient\";\r\n\r\nexport type {\r\n  TContentTypes,\r\n  TDecoratorArg,\r\n  TProps,\r\n  TResponseDataArg,\r\n};\r\n\r\ntype TMock = TBodyInt | FormData | JsonBodyType;\r\n\r\ntype TDecoratorArg = {\r\n  res: Response;\r\n  req: Request;\r\n  mock: TMock;\r\n  type: TContentTypes;\r\n};\r\n\r\ntype TProps = {\r\n  description?: string;\r\n  method?: HttpMethods;\r\n  mock?: TMock;\r\n  body?: BodyInit | null;\r\n  endpoint: string;\r\n  type?: TContentTypes;\r\n  delay?: number;\r\n  tags?: string[];\r\n  getDecorator?: (data: TDecoratorArg) => Promise<Response>;\r\n  getResponseData?: (data: TResponseDataArg) => Promise<{\r\n    mock: TMock;\r\n    init: HttpResponseInit;\r\n  }>;\r\n};\r\n\r\ntype TBodyInt = string | null | undefined;\r\n\r\ntype TResponseDataArg = {\r\n  req: Request;\r\n  mock: TMock;\r\n  type: TContentTypes;\r\n};\r\n\r\nconst defaultInit: HttpResponseInit = {\r\n  status: 200,\r\n  statusText: \"OK\",\r\n  headers: new Headers(),\r\n};\r\n\r\nconst defaultDecorator: TProps[\"getDecorator\"] = async function(arg) {\r\n  return arg.res;\r\n};\r\n\r\nconst defaultResponseData: TProps[\"getResponseData\"] = async function(arg) {\r\n  return {\r\n    mock: arg.mock,\r\n    init: defaultInit,\r\n  };\r\n};\r\n\r\n\r\n/**\r\n * Получает результат ответа MSW\r\n * @param props{Object=}\r\n * @param props.description{String=} описание запроса\r\n * @param props.method{String=} метод запроса\r\n * @param props.mock{Object=} данные ответа на запрос\r\n * @param props.endpoint{String} точка запроса\r\n * @param props.type{String=} тип ответа\r\n * @param props.status{Number=} статус ответа\r\n * @param props.delay{Number=} дополнительное время ожидания ответа\r\n * @param props.headers{Object=} заголовки ответа\r\n * @param props.body{*} пример тела запроса\r\n * @param props.tags{String[]} теги\r\n * @param url{String=} адрес API\r\n * @returns {THttpHandlerWithExtendedInfo}\r\n * @example\r\n * import { getApiMock } from \"@delement/ui/utils/msw\";\r\n *\r\n * const handler = getApiMock({\r\n *   endpoint: \"/users\",\r\n *   mock: [{ id: 1, name: \"Alex\" }],\r\n * });\r\n */\r\nconst getApiMock = (\r\n  props: TProps,\r\n  url: string | undefined = ApiClient.defaults.url\r\n): THttpHandlerWithExtendedInfo => {\r\n\r\n  const {\r\n    getDecorator = defaultDecorator,\r\n    getResponseData = defaultResponseData,\r\n    method = HttpMethods.GET,\r\n    mock,\r\n    type = contentTypes.json,\r\n    endpoint,\r\n    body,\r\n    description = \"\",\r\n    delay = 0,\r\n    tags = [ \"Endpoints\" ],\r\n  } = props || {};\r\n\r\n  if (!url?.startsWith(\"http\")) {\r\n    throw new Error(`[getApiMock] Prop \"url\" needs to be a valid URL with protocol e.g. \"http://\"`);\r\n  }\r\n\r\n  const path = ApiClient.getEndpoint(url, endpoint);\r\n\r\n  const getResponse = (mock: unknown, init: HttpResponseInit): Response => {\r\n\r\n    [\r\n      \"Access-Control-Allow-Origin\",\r\n      \"Access-Control-Allow-Methods\",\r\n      \"Access-Control-Allow-Headers\",\r\n    ].forEach((header) => {\r\n      if (init.headers instanceof Headers) {\r\n        init.headers.set(header, \"*\");\r\n      } else if (typeof init.headers === \"object\") {\r\n        (init.headers as Record<string, string>)[header] = \"*\";\r\n      }\r\n    });\r\n\r\n    switch (true) {\r\n      case type === contentTypes.json:\r\n        return HttpResponse.json(mock as JsonBodyType, init);\r\n      case type === contentTypes.plain:\r\n        return HttpResponse.text(mock as TBodyInt, init);\r\n      case type === contentTypes.binary:\r\n        return HttpResponse.arrayBuffer(mock as ArrayBuffer, init);\r\n      case type === contentTypes.xml:\r\n        return HttpResponse.xml(mock as TBodyInt, init);\r\n      case type === contentTypes.html:\r\n        return HttpResponse.html(mock as TBodyInt, init);\r\n      case type === contentTypes.formData:\r\n        return HttpResponse.formData(mock as FormData, init);\r\n      default:\r\n        throw new Error(`[getResponseMock] Can't parse Content-Type as \"${type}\". Only the listed ones are available: \"${Object.keys(contentTypes).join(\", \")}\"`);\r\n    }\r\n  };\r\n\r\n  async function resolver({ request }: { request: Request; }): Promise<Response> {\r\n\r\n    // delay\r\n    if (delay > 0) {\r\n      await wait(delay);\r\n    }\r\n\r\n    // mock and init after user decoration\r\n    const {\r\n      mock: userMock,\r\n      init: userInit,\r\n    } = await getResponseData({\r\n      req: request,\r\n      mock,\r\n      type,\r\n    });\r\n\r\n    // resp\r\n    const response = getResponse(userMock, {\r\n      ...defaultInit,\r\n      ...userInit,\r\n    });\r\n\r\n    // decorator\r\n    return await getDecorator({\r\n      req: request,\r\n      res: response,\r\n      mock: userMock,\r\n      type,\r\n    });\r\n  }\r\n\r\n  const getHTTPHandler = () => {\r\n    switch (method) {\r\n      case HttpMethods.POST:\r\n        return http.post(path, resolver);\r\n      case HttpMethods.PUT:\r\n        return http.put(path, resolver);\r\n      case HttpMethods.PATCH:\r\n        return http.patch(path, resolver);\r\n      case HttpMethods.DELETE:\r\n        return http.delete(path, resolver);\r\n      case HttpMethods.OPTIONS:\r\n        return http.options(path, resolver);\r\n      default:\r\n        return http.get(path, resolver);\r\n    }\r\n  };\r\n\r\n  // create handler\r\n  const mswHandler = getHTTPHandler();\r\n\r\n  Object.assign(mswHandler.info, {\r\n    mock,\r\n    type,\r\n    description,\r\n    tags,\r\n    body,\r\n  });\r\n\r\n  return mswHandler as unknown as THttpHandlerWithExtendedInfo;\r\n};\r\n\r\ngetApiMock.requestMethods = HttpMethods;\r\ngetApiMock.contentTypes = contentTypes;\r\n\r\nexport {\r\n  getApiMock,\r\n};\r\n"],"names":["defaultInit","status","statusText","headers","Headers","defaultDecorator","async","arg","res","defaultResponseData","mock","init","getApiMock","props","url","ApiClient","defaults","getDecorator","getResponseData","method","HttpMethods","GET","type","contentTypes","json","endpoint","body","description","delay","tags","startsWith","Error","path","getEndpoint","getResponse","forEach","header","set","HttpResponse","plain","text","binary","arrayBuffer","xml","html","formData","Object","keys","join","resolver","request","wait","userMock","userInit","req","response","getHTTPHandler","POST","http","post","PUT","put","PATCH","patch","DELETE","delete","OPTIONS","options","get","mswHandler","assign","info","requestMethods"],"mappings":"2JAiDA,MAAMA,YAAgC,CACpCC,OAAQ,IACRC,WAAY,KACZC,QAAS,IAAIC,SAGf,MAAMC,iBAA2CC,eAAeC,KAC9D,OAAOA,IAAIC,GACb,EAEA,MAAMC,oBAAiDH,eAAeC,KACpE,MAAO,CACLG,KAAMH,IAAIG,KACVC,KAAMX,YAEV;;;;;;;;;;;;;;;;;;;;;;;GA0BA,MAAMY,WAAa,CACjBC,MACAC,IAA0BC,UAAUC,SAASF,OAG7C,MAAMG,aACJA,aAAeZ,iBAAgBa,gBAC/BA,gBAAkBT,oBAAmBU,OACrCA,OAASC,YAAYC,IAAGX,KACxBA,KAAIY,KACJA,KAAOC,aAAaC,KAAIC,SACxBA,SAAQC,KACRA,KAAIC,YACJA,YAAc,GACdC,MAAAA,QAAQ,EAACC,KACTA,KAAO,CAAE,cACPhB,OAAS,CAAA,EAEb,IAAKC,KAAKgB,WAAW,QACnB,MAAM,IAAIC,MAAM,gFAGlB,MAAMC,KAAOjB,UAAUkB,YAAYnB,IAAKW,UAExC,MAAMS,YAAc,CAACxB,KAAeC,QAElC,CACE,8BACA,+BACA,gCACAwB,QAASC,SACT,GAAIzB,KAAKR,mBAAmBC,QAC1BO,KAAKR,QAAQkC,IAAID,OAAQ,UACpB,UAAWzB,KAAKR,UAAY,SAChCQ,KAAKR,QAAmCiC,QAAU,MAIvD,OAAQ,MACN,KAAKd,OAASC,aAAaC,KACzB,OAAOc,aAAad,KAAKd,KAAsBC,MACjD,KAAKW,OAASC,aAAagB,MACzB,OAAOD,aAAaE,KAAK9B,KAAkBC,MAC7C,KAAKW,OAASC,aAAakB,OACzB,OAAOH,aAAaI,YAAYhC,KAAqBC,MACvD,KAAKW,OAASC,aAAaoB,IACzB,OAAOL,aAAaK,IAAIjC,KAAkBC,MAC5C,KAAKW,OAASC,aAAaqB,KACzB,OAAON,aAAaM,KAAKlC,KAAkBC,MAC7C,KAAKW,OAASC,aAAasB,SACzB,OAAOP,aAAaO,SAASnC,KAAkBC,MACjD,QACE,MAAM,IAAIoB,MAAM,kDAAkDT,+CAA+CwB,OAAOC,KAAKxB,cAAcyB,KAAK,YAItJ1C,eAAe2C,UAASC,QAAEA;;AAGxB,GAAItB,QAAQ,QACJuB,MAAKvB;sCAIb;MACElB,KAAM0C,SACNzC,KAAM0C,gBACEnC,gBAAgB,CACxBoC,IAAKJ,QACLxC,UACAY;OAIF;MAAMiC,SAAWrB,YAAYkB,SAAU,IAClCpD,eACAqD;YAIL;aAAapC,aAAa,CACxBqC,IAAKJ,QACL1C,IAAK+C,SACL7C,KAAM0C,SACN9B,WAEJ,CAEA,MAAMkC,eAAiB,KACrB,OAAQrC,QACN,KAAKC,YAAYqC,KACf,OAAOC,KAAKC,KAAK3B,KAAMiB,UACzB,KAAK7B,YAAYwC,IACf,OAAOF,KAAKG,IAAI7B,KAAMiB,UACxB,KAAK7B,YAAY0C,MACf,OAAOJ,KAAKK,MAAM/B,KAAMiB,UAC1B,KAAK7B,YAAY4C,OACf,OAAON,KAAKO,OAAOjC,KAAMiB,UAC3B,KAAK7B,YAAY8C,QACf,OAAOR,KAAKS,QAAQnC,KAAMiB,UAC5B,QACE,OAAOS,KAAKU,IAAIpC,KAAMiB;iBAK5B;MAAMoB,WAAab,iBAEnBV,OAAOwB,OAAOD,WAAWE,KAAM,CAC7B7D,UACAY,UACAK,wBACAE,UACAH,YAGF,OAAO2C,YAGTzD,WAAW4D,eAAiBpD,YAC5BR,WAAWW,aAAeA"}