@elysiajs/eden
Version:
Fully type-safe Elysia client
2 lines (1 loc) • 10.5 kB
JavaScript
;var Eden=(()=>{var P=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var se=Object.prototype.hasOwnProperty;var ae=(e,t)=>{for(var n in t)P(e,n,{get:t[n],enumerable:!0})},ie=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of re(t))!se.call(e,s)&&s!==n&&P(e,s,{get:()=>t[s],enumerable:!(r=ne(t,s))||r.enumerable});return e};var oe=e=>ie(P({},"__esModule",{value:!0}),e);var we={};ae(we,{edenFetch:()=>te,edenTreaty:()=>ee,treaty:()=>Q});var F=class extends Error{constructor(n,r){super(r+"");this.status=n;this.value=r}};var ce=/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/,fe=/(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{2}\s\d{4}\s\d{2}:\d{2}:\d{2}\sGMT(?:\+|-)\d{4}\s\([^)]+\)/,de=/^(?:(?:(?:(?:0?[1-9]|[12][0-9]|3[01])[/\s-](?:0?[1-9]|1[0-2])[/\s-](?:19|20)\d{2})|(?:(?:19|20)\d{2}[/\s-](?:0?[1-9]|1[0-2])[/\s-](?:0?[1-9]|[12][0-9]|3[01]))))(?:\s(?:1[012]|0?[1-9]):[0-5][0-9](?::[0-5][0-9])?(?:\s[AP]M)?)?$/,ye=e=>e.trim().length!==0&&!Number.isNaN(Number(e)),V=e=>{if(typeof e!="string")return null;let t=e.replace(/"/g,"");if(ce.test(t)||fe.test(t)||de.test(t)){let n=new Date(t);if(!Number.isNaN(n.getTime()))return n}return null},ue=e=>{let t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===123&&n===125||t===91&&n===93},le=e=>JSON.parse(e,(t,n)=>{let r=V(n);return r||n}),L=e=>{if(!e)return e;if(ye(e))return+e;if(e==="true")return!0;if(e==="false")return!1;let t=V(e);if(t)return t;if(ue(e))try{return le(e)}catch{}return e},D=e=>{let t=e.data.toString();return t==="null"?null:L(t)};var I=class{constructor(t){this.url=t;this.ws=new WebSocket(t)}ws;send(t){return Array.isArray(t)?(t.forEach(n=>this.send(n)),this):(this.ws.send(typeof t=="object"?JSON.stringify(t):t.toString()),this)}on(t,n,r){return this.addEventListener(t,n,r)}off(t,n,r){return this.ws.removeEventListener(t,n,r),this}subscribe(t,n){return this.addEventListener("message",t,n)}addEventListener(t,n,r){return this.ws.addEventListener(t,s=>{if(t==="message"){let i=D(s);n({...s,data:i})}else n(s)},r),this}removeEventListener(t,n,r){return this.off(t,n,r),this}close(){return this.ws.close(),this}};var pe=["get","post","put","delete","patch","options","head","connect","subscribe"],Z=["localhost","127.0.0.1","0.0.0.0"],U=typeof FileList>"u",G=e=>U?e instanceof Blob:e instanceof FileList||e instanceof File,he=e=>{if(!e)return!1;for(let t in e)if(G(e[t])||Array.isArray(e[t])&&e[t].find(G))return!0;return!1},J=e=>U?e:new Promise(t=>{let n=new FileReader;n.onload=()=>{let r=new File([n.result],e.name,{lastModified:e.lastModified,type:e.type});t(r)},n.readAsArrayBuffer(e)}),W=(e,t,n={},r={})=>{if(Array.isArray(e)){for(let s of e)if(!Array.isArray(s))r=W(s,t,n,r);else{let i=s[0];if(typeof i=="string")r[i.toLowerCase()]=s[1];else for(let[o,y]of i)r[o.toLowerCase()]=y}return r}if(!e)return r;switch(typeof e){case"function":if(e instanceof Headers)return W(e,t,n,r);let s=e(t,n);return s?W(s,t,n,r):r;case"object":if(e instanceof Headers)return e.forEach((i,o)=>{r[o.toLowerCase()]=i}),r;for(let[i,o]of Object.entries(e))r[i.toLowerCase()]=o;return r;default:return r}};async function*ge(e){let t=e.body;if(!t)return;let n=t.getReader(),r=new TextDecoder;try{for(;;){let{done:s,value:i}=await n.read();if(s)break;let o=r.decode(i);yield L(o)}}finally{n.releaseLock()}}var K=(e,t,n=[],r)=>new Proxy(()=>{},{get(s,i){return K(e,t,i==="index"?n:[...n,i],r)},apply(s,i,[o,y]){if(!o||y||typeof o=="object"&&Object.keys(o).length!==1||pe.includes(n.at(-1))){let M=[...n],v=M.pop(),b="/"+M.join("/"),{fetcher:O=fetch,headers:R,onRequest:g,onResponse:w,fetch:S}=t,p=v==="get"||v==="head"||v==="subscribe";R=W(R,b,y);let N=p?o?.query:y?.query,x="";if(N){let a=(k,m)=>{x+=(x?"&":"?")+`${encodeURIComponent(k)}=${encodeURIComponent(m)}`};for(let[k,m]of Object.entries(N)){if(Array.isArray(m)){for(let c of m)a(k,c);continue}if(m!=null){if(typeof m=="object"){a(k,JSON.stringify(m));continue}a(k,`${m}`)}}}if(v==="subscribe"){let a=e.replace(/^([^]+):\/\//,e.startsWith("https://")?"wss://":e.startsWith("http://")||Z.find(k=>e.includes(k))?"ws://":"wss://")+b+x;return new I(a)}return(async()=>{let a={method:v?.toUpperCase(),body:o,...S,headers:R};a.headers={...R,...W(p?o?.headers:y?.headers,b,a)};let k=p&&typeof o=="object"?o.fetch:y?.fetch;if(a={...a,...k},p&&delete a.body,g){Array.isArray(g)||(g=[g]);for(let d of g){let f=await d(b,a);typeof f=="object"&&(a={...a,...f,headers:{...a.headers,...W(f.headers,b,a)}})}}if(p&&delete a.body,he(o)){let d=new FormData;for(let[f,l]of Object.entries(a.body)){if(Array.isArray(l)){for(let E=0;E<l.length;E++){let A=l[E];d.append(f,A instanceof File?await J(A):A)}continue}if(U){d.append(f,l);continue}if(l instanceof File){d.append(f,await J(l));continue}if(l instanceof FileList){for(let E=0;E<l.length;E++)d.append(f,await J(l[E]));continue}d.append(f,l)}a.body=d}else typeof o=="object"?(a.headers["content-type"]="application/json",a.body=JSON.stringify(o)):o!=null&&(a.headers["content-type"]="text/plain");if(p&&delete a.body,g){Array.isArray(g)||(g=[g]);for(let d of g){let f=await d(b,a);typeof f=="object"&&(a={...a,...f,headers:{...a.headers,...W(f.headers,b,a)}})}}let m=e+b+x,c=await(r?.handle(new Request(m,a))??O(m,a)),h=null,u=null;if(w){Array.isArray(w)||(w=[w]);for(let d of w)try{let f=await d(c.clone());if(f!=null){h=f;break}}catch(f){f instanceof F?u=f:u=new F(422,f);break}}if(h!==null)return{data:h,error:u,response:c,status:c.status,headers:c.headers};switch(c.headers.get("Content-Type")?.split(";")[0]){case"text/event-stream":h=ge(c);break;case"application/json":h=await c.json();break;case"application/octet-stream":h=await c.arrayBuffer();break;case"multipart/form-data":let d=await c.formData();h={},d.forEach((f,l)=>{h[l]=f});break;default:h=await c.text().then(L)}return(c.status>=300||c.status<200)&&(u=new F(c.status,h),h=null),{data:h,error:u,response:c,status:c.status,headers:c.headers}})()}return typeof o=="object"?K(e,t,[...n,Object.values(o)[0]],r):K(e,t,n)}}),Q=(e,t={})=>typeof e=="string"?(t.keepDomain||(e.includes("://")||(e=(Z.find(n=>e.includes(n))?"http://":"https://")+e),e.endsWith("/")&&(e=e.slice(0,-1))),K(e,t)):(typeof window<"u"&&console.warn("Elysia instance server found on client side, this is not recommended for security reason. Use generic type instead."),K("http://e.ly",t,[],e));var z=(e,t,n)=>{if(e.endsWith("/")||(e+="/"),t==="index"&&(t=""),!n||!Object.keys(n).length)return`${e}${t}`;let r="";for(let[s,i]of Object.entries(n))r+=`${s}=${i}&`;return`${e}${t}?${r.slice(0,-1)}`};var H=typeof FileList>"u",X=e=>H?e instanceof Blob:e instanceof FileList||e instanceof File,me=e=>{if(!e)return!1;for(let t in e){if(X(e[t]))return!0;if(Array.isArray(e[t])&&e[t].find(n=>X(n)))return!0}return!1},_=e=>H?e:new Promise(t=>{let n=new FileReader;n.onload=()=>{let r=new File([n.result],e.name,{lastModified:e.lastModified,type:e.type});t(r)},n.readAsArrayBuffer(e)}),B=class{ws;url;constructor(t){this.ws=new WebSocket(t),this.url=t}send(t){return Array.isArray(t)?(t.forEach(n=>this.send(n)),this):(this.ws.send(typeof t=="object"?JSON.stringify(t):t.toString()),this)}on(t,n,r){return this.addEventListener(t,n,r)}off(t,n,r){return this.ws.removeEventListener(t,n,r),this}subscribe(t,n){return this.addEventListener("message",t,n)}addEventListener(t,n,r){return this.ws.addEventListener(t,s=>{if(t==="message"){let i=D(s);n({...s,data:i})}else n(s)},r),this}removeEventListener(t,n,r){return this.off(t,n,r),this}close(){return this.ws.close(),this}},Y=(e,t="",n)=>new Proxy(()=>{},{get(r,s,i){return Y(e,`${t}/${s.toString()}`,n)},apply(r,s,[i,o={}]=[{},{}]){let y=i!==void 0&&(typeof i!="object"||Array.isArray(i))?i:void 0,{$query:M,$fetch:v,$headers:b,$transform:O,getRaw:R,...g}=i??{};y??=g;let w=t.lastIndexOf("/"),S=t.slice(w+1).toUpperCase(),p=z(e,w===-1?"/":t.slice(0,w),Object.assign(o.query??{},M)),N=n.fetcher??fetch,x=n.transform?Array.isArray(n.transform)?n.transform:[n.transform]:void 0,a=O?Array.isArray(O)?O:[O]:void 0;return a&&(x?x=a.concat(x):x=a),S==="SUBSCRIBE"?new B(p.replace(/^([^]+):\/\//,p.startsWith("https://")?"wss://":"ws://")):(async m=>{let c,h={...n.$fetch?.headers,...v?.headers,...o.headers,...b};if(S!=="GET"&&S!=="HEAD"){c=Object.keys(y).length||Array.isArray(y)?y:void 0;let E=c&&(typeof c=="object"||Array.isArray(y));if(E&&me(c)){let $=new FormData;for(let[C,T]of Object.entries(c))if(H)$.append(C,T);else if(T instanceof File)$.append(C,await _(T));else if(T instanceof FileList)for(let j=0;j<T.length;j++)$.append(C,await _(T[j]));else if(Array.isArray(T))for(let j=0;j<T.length;j++){let q=T[j];$.append(C,q instanceof File?await _(q):q)}else $.append(C,T);c=$}else c!=null&&(h["content-type"]=E?"application/json":"text/plain",c=E?JSON.stringify(c):y)}let u=await N(p,{method:S,body:c,...n.$fetch,...o.fetch,...v,headers:h}),d;if(m.getRaw)return u;switch(u.headers.get("Content-Type")?.split(";")[0]){case"application/json":d=await u.json();break;default:d=await u.text().then(L)}let f=u.status>=300||u.status<200?new F(u.status,d):null,l={data:d,error:f,response:u,status:u.status,headers:u.headers};if(x)for(let E of x){let A=E(l);A instanceof Promise&&(A=await A),A!=null&&(l=A)}return l})({getRaw:R})}}),ee=(e,t={fetcher:fetch})=>new Proxy({},{get(n,r){return Y(e,r,t)}});var Ee=async e=>{switch(e.headers.get("Content-Type")?.split(";")[0]){case"application/json":return e.json();case"application/octet-stream":return e.arrayBuffer();case"multipart/form-data":{let n=await e.formData(),r={};return n.forEach((s,i)=>{r[i]=s}),r}}return e.text().then(L)},be=async(e,t)=>{let n=await Ee(e);return e.status>300?{data:null,status:e.status,headers:e.headers,retry:t,error:new F(e.status,n)}:{data:n,error:null,status:e.status,headers:e.headers,retry:t}},te=(e,t)=>(n,{query:r,params:s,body:i,...o}={})=>{s&&Object.entries(s).forEach(([S,p])=>{n=n.replace(`:${S}`,p)});let y=o.headers?.["Content-Type"];if(!y||y==="application/json")try{i=JSON.stringify(i)}catch{}let M=t?.fetcher||globalThis.fetch,v=r?Object.fromEntries(Object.entries(r).filter(([S,p])=>p!=null)):null,b=v?`?${new URLSearchParams(v).toString()}`:"",O=`${e}${n}${b}`,R=i?{"content-type":"application/json",...o.headers}:o.headers,g={...o,method:o.method?.toUpperCase()||"GET",headers:R,body:i},w=()=>M(O,g).then(S=>be(S,w));return w()};return oe(we);})();