vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
1 lines • 4.23 kB
Source Map (JSON)
{"version":3,"file":"request.mjs","sources":["../../../components/upload/request.ts"],"sourcesContent":["import { has, isDefined, noop } from '@vexip-ui/utils'\n\nimport type { UploadFetchOptions, UploadHttpError } from './symbol'\n\nfunction getError(url: string, xhr: XMLHttpRequest) {\n const message = `fail to post ${url} ${xhr.status}'`\n const error = new Error(message) as UploadHttpError\n\n error.response = getBody(xhr)\n error.url = url\n error.status = xhr.status\n error.method = 'POST'\n\n return error\n}\n\nfunction getBody(xhr: XMLHttpRequest) {\n const text = xhr.responseText || xhr.response\n\n if (!text) {\n return text\n }\n\n try {\n return JSON.parse(text)\n } catch (e) {\n return text\n }\n}\n\nexport function upload(options: UploadFetchOptions) {\n if (typeof XMLHttpRequest === 'undefined') {\n return noop\n }\n\n const xhr = new XMLHttpRequest()\n const url = options.url\n\n if (xhr.upload && options.onProgress) {\n xhr.upload.onprogress = event => {\n let percent = 0\n\n if (event.total > 0) {\n percent = (event.loaded / event.total) * 100\n }\n\n options.onProgress!(percent)\n }\n }\n\n const formData = new FormData()\n\n if (options.data) {\n const data = options.data\n\n Object.keys(data).forEach(key => {\n formData.append(key, data[key])\n })\n }\n\n formData.append(options.field || 'file', options.file)\n options.file.path && formData.append(options.pathField || 'path', options.file.path)\n\n if (options.onError) {\n xhr.onerror = () => {\n options.onError!(getError(url, xhr))\n }\n }\n\n xhr.onload = () => {\n if (xhr.status < 200 || xhr.status >= 300) {\n if (options.onError) {\n options.onError(getError(url, xhr))\n }\n\n return\n }\n\n const body = getBody(xhr)\n\n options.onSuccess?.(body)\n }\n\n if (options.onAbort) {\n xhr.onabort = () => {\n options.onAbort!()\n }\n }\n\n xhr.open('POST', url, true)\n\n if (options.withCredentials && 'withCredentials' in xhr) {\n xhr.withCredentials = true\n }\n\n const headers = options.headers ?? {}\n\n Object.keys(headers).forEach(header => {\n if (has(headers, header) && isDefined(headers[header])) {\n xhr.setRequestHeader(header, headers[header])\n }\n })\n\n xhr.send(formData)\n\n return () => xhr.abort()\n}\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;"}