UNPKG

formdata-polyfill

Version:

HTML5 `FormData` for Browsers and Node.

35 lines (29 loc) 1.79 kB
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */ import C from 'fetch-blob' import F from 'fetch-blob/file.js' var {toStringTag:t,iterator:i,hasInstance:h}=Symbol, m='append,set,get,getAll,delete,keys,values,entries,forEach,constructor'.split(','), f=(a,b,c)=>(a+='',/^(Blob|File)$/.test(b?.[t])?[(c=c!==void 0?c+'':b[t]=='File'?b.name:'blob',a),b.name!==c||b[t]=='blob'?new F([b],c):b]:[a,b+'']), e=(c,f)=>(f?c:c.replace(/\r?\n|\r/g,'\r\n')).replace(/\n/g,'%0A').replace(/\r/g,'%0D').replace(/"/g,'%22') export const File = F export class FormData { #d=[]; get [t]() {return 'FormData'} [i](){return this.entries()} [h](o) {return typeof o==='object'&&o[t]==='FormData'&&!m.some(m=>typeof o[m]!='function')} append(...a){this.#d.push(f(...a))}delete(a){a+='';this.#d=this.#d.filter(([b])=>b!==a)} get(a){a+='';for(var b=this.#d,l=b.length,c=0;c<l;c++)if(b[c][0]===a)return b[c][1];return null} getAll(a,b){b=[];a+='';this.#d.forEach(c=>c[0]===a&&b.push(c[1]));return b} has(a){a+='';return this.#d.some(b=>b[0]===a)} forEach(a,b){for(var [c,d]of this)a.call(b,d,c,this)} set(...a){var b=[],c=!0;a=f(...a);this.#d.forEach(d=>{d[0]===a[0]?c&&(c=!b.push(a)):b.push(d)});c&&b.push(a);this.#d=b} *entries(){yield*this.#d} *keys(){for(var[a]of this)yield a} *values(){for(var[,a]of this)yield a}} export function formDataToBlob (F,B=C){ var b='----formdata-'+Math.random(),c=[],p=`--${b}\r\nContent-Disposition: form-data; name="` F.forEach((v,n)=>typeof v=='string' ?c.push(p+e(n)+`"\r\n\r\n${v.replace(/\r(?!\n)|(?<!\r)\n/g, '\r\n')}\r\n`) :c.push(p+e(n)+`"; filename="${e(v.name, 1)}"\r\nContent-Type: ${v.type||"application/octet-stream"}\r\n\r\n`, v, '\r\n')) c.push(`--${b}--`) return new B(c,{type:"multipart/form-data; boundary="+b})}