{"version":3,"file":"request.mjs","sources":["../../../components/upload/request.ts"],"sourcesContent":["import { has, isDefined, noop } from '@vexip-ui/utils'\r\n\r\nimport type { UploadFetchOptions, UploadHttpError } from './symbol'\r\n\r\nfunction getError(url: string, xhr: XMLHttpRequest) {\r\n  const message = `fail to post ${url} ${xhr.status}'`\r\n  const error = new Error(message) as UploadHttpError\r\n\r\n  error.response = getBody(xhr)\r\n  error.url = url\r\n  error.status = xhr.status\r\n  error.method = 'POST'\r\n\r\n  return error\r\n}\r\n\r\nfunction getBody(xhr: XMLHttpRequest) {\r\n  const text = xhr.responseText || xhr.response\r\n\r\n  if (!text) {\r\n    return text\r\n  }\r\n\r\n  try {\r\n    return JSON.parse(text)\r\n  } catch (e) {\r\n    return text\r\n  }\r\n}\r\n\r\nexport function upload(options: UploadFetchOptions) {\r\n  if (typeof XMLHttpRequest === 'undefined') {\r\n    return noop\r\n  }\r\n\r\n  const xhr = new XMLHttpRequest()\r\n  const url = options.url\r\n\r\n  if (xhr.upload && options.onProgress) {\r\n    xhr.upload.onprogress = event => {\r\n      let percent = 0\r\n\r\n      if (event.total > 0) {\r\n        percent = (event.loaded / event.total) * 100\r\n      }\r\n\r\n      options.onProgress!(percent)\r\n    }\r\n  }\r\n\r\n  const formData = new FormData()\r\n\r\n  if (options.data) {\r\n    const data = options.data\r\n\r\n    Object.keys(data).forEach(key => {\r\n      formData.append(key, data[key])\r\n    })\r\n  }\r\n\r\n  formData.append(options.field || 'file', options.file)\r\n  options.file.path && formData.append(options.pathField || 'path', options.file.path)\r\n\r\n  if (options.onError) {\r\n    xhr.onerror = () => {\r\n      options.onError!(getError(url, xhr))\r\n    }\r\n  }\r\n\r\n  xhr.onload = () => {\r\n    if (xhr.status < 200 || xhr.status >= 300) {\r\n      if (options.onError) {\r\n        options.onError(getError(url, xhr))\r\n      }\r\n\r\n      return\r\n    }\r\n\r\n    const body = getBody(xhr)\r\n\r\n    options.onSuccess?.(body)\r\n  }\r\n\r\n  if (options.onAbort) {\r\n    xhr.onabort = () => {\r\n      options.onAbort!()\r\n    }\r\n  }\r\n\r\n  xhr.open('POST', url, true)\r\n\r\n  if (options.withCredentials && 'withCredentials' in xhr) {\r\n    xhr.withCredentials = true\r\n  }\r\n\r\n  const headers = options.headers ?? {}\r\n\r\n  Object.keys(headers).forEach(header => {\r\n    if (has(headers, header) && isDefined(headers[header])) {\r\n      xhr.setRequestHeader(header, headers[header])\r\n    }\r\n  })\r\n\r\n  xhr.send(formData)\r\n\r\n  return () => xhr.abort()\r\n}\r\n"],"names":["getError","url","xhr","message","error","getBody","text","upload","options","noop","event","percent","formData","data","key","body","_a","headers","header","has","isDefined"],"mappings":";AAIA,SAASA,EAASC,GAAaC,GAAqB;AAClD,QAAMC,IAAU,gBAAgBF,CAAG,IAAIC,EAAI,MAAM,KAC3CE,IAAQ,IAAI,MAAMD,CAAO;AAEzB,SAAAC,EAAA,WAAWC,EAAQH,CAAG,GAC5BE,EAAM,MAAMH,GACZG,EAAM,SAASF,EAAI,QACnBE,EAAM,SAAS,QAERA;AACT;AAEA,SAASC,EAAQH,GAAqB;AAC9B,QAAAI,IAAOJ,EAAI,gBAAgBA,EAAI;AAErC,MAAI,CAACI;AACI,WAAAA;AAGL,MAAA;AACK,WAAA,KAAK,MAAMA,CAAI;AAAA,UACZ;AACH,WAAAA;AAAA,EAAA;AAEX;AAEO,SAASC,EAAOC,GAA6B;AAC9C,MAAA,OAAO,iBAAmB;AACrB,WAAAC;AAGH,QAAAP,IAAM,IAAI,eAAe,GACzBD,IAAMO,EAAQ;AAEhB,EAAAN,EAAI,UAAUM,EAAQ,eACpBN,EAAA,OAAO,aAAa,CAASQ,MAAA;AAC/B,QAAIC,IAAU;AAEV,IAAAD,EAAM,QAAQ,MACLC,IAAAD,EAAM,SAASA,EAAM,QAAS,MAG3CF,EAAQ,WAAYG,CAAO;AAAA,EAC7B;AAGI,QAAAC,IAAW,IAAI,SAAS;AAE9B,MAAIJ,EAAQ,MAAM;AAChB,UAAMK,IAAOL,EAAQ;AAErB,WAAO,KAAKK,CAAI,EAAE,QAAQ,CAAOC,MAAA;AAC/B,MAAAF,EAAS,OAAOE,GAAKD,EAAKC,CAAG,CAAC;AAAA,IAAA,CAC/B;AAAA,EAAA;AAGH,EAAAF,EAAS,OAAOJ,EAAQ,SAAS,QAAQA,EAAQ,IAAI,GAC7CA,EAAA,KAAK,QAAQI,EAAS,OAAOJ,EAAQ,aAAa,QAAQA,EAAQ,KAAK,IAAI,GAE/EA,EAAQ,YACVN,EAAI,UAAU,MAAM;AAClB,IAAAM,EAAQ,QAASR,EAASC,GAAKC,CAAG,CAAC;AAAA,EACrC,IAGFA,EAAI,SAAS,MAAM;;AACjB,QAAIA,EAAI,SAAS,OAAOA,EAAI,UAAU,KAAK;AACzC,MAAIM,EAAQ,WACVA,EAAQ,QAAQR,EAASC,GAAKC,CAAG,CAAC;AAGpC;AAAA,IAAA;AAGI,UAAAa,IAAOV,EAAQH,CAAG;AAExB,KAAAc,IAAAR,EAAQ,cAAR,QAAAQ,EAAA,KAAAR,GAAoBO;AAAA,EACtB,GAEIP,EAAQ,YACVN,EAAI,UAAU,MAAM;AAClB,IAAAM,EAAQ,QAAS;AAAA,EACnB,IAGEN,EAAA,KAAK,QAAQD,GAAK,EAAI,GAEtBO,EAAQ,mBAAmB,qBAAqBN,MAClDA,EAAI,kBAAkB;AAGlB,QAAAe,IAAUT,EAAQ,WAAW,CAAC;AAEpC,gBAAO,KAAKS,CAAO,EAAE,QAAQ,CAAUC,MAAA;AACjC,IAAAC,EAAIF,GAASC,CAAM,KAAKE,EAAUH,EAAQC,CAAM,CAAC,KACnDhB,EAAI,iBAAiBgB,GAAQD,EAAQC,CAAM,CAAC;AAAA,EAC9C,CACD,GAEDhB,EAAI,KAAKU,CAAQ,GAEV,MAAMV,EAAI,MAAM;AACzB;"}