grab-api.js
Version:
Generate Request to API from Browser
3 lines (2 loc) • 9.7 kB
JavaScript
;function e(e="",t={}){let{color:o=null,style:n="color: blue; font-size: 12pt;",hideInProduction:r,startSpinner:i=!1,stopSpinner:a=!1}=t;void 0===r&&(r="undefined"!=typeof window&&(null==window?void 0:window.location.hostname.includes("localhost"))),"object"==typeof e&&(e=l(e)+"\n\n"+JSON.stringify(e,null,2)),1==n.split(" ").length||o?n=`color: ${n||o}; font-size: 12pt;`:n.match(/^#[0-9a-fA-F]{6}$/)&&(n=`color: ${n}; font-size: 12pt;`);var s=0;return i?(global||globalThis).interval=setInterval((()=>{process.stdout.write("\r"+"⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏".split("")[s=++s%10]+" "+e)}),50):a?(clearInterval((global||globalThis).interval),process.stdout.write("\r"+e+" ".repeat(e.length)+"\n")):"string"==typeof n?r?console.debug((n?"%c":"")+e,n):console.log((n?"%c":"")+e,n):"object"==typeof n&&console.log(e,...n),!0}Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={reset:"[0m",yellow:"[33m",cyan:"[36m",magenta:"[35m",gray:"[90m",green:"[32m",blue:"[34m",red:"[31m",white:"[37m"};function o(e){return"string"==typeof e?t.yellow:"number"==typeof e?t.cyan:"boolean"==typeof e?t.magenta:"function"==typeof e?t.red:null===e?t.gray:Array.isArray(e)?t.blue:"object"==typeof e?t.green:t.white}function n(e){return"string"==typeof e?'""':"number"==typeof e?"number":"boolean"==typeof e?"bool":"function"==typeof e?"function":null===e?"null":Array.isArray(e)?e.length?"["+n(e[0])+"]":"[]":"object"==typeof e?"{...}":typeof e}function l(e,r=0){const i=" ".repeat(r);if("object"!=typeof e||null===e){return o(e)+n(e)+t.reset}if(Array.isArray(e)){let o=t.blue+"["+t.reset;return e.length&&(o+="\n"),e.forEach(((t,n)=>{o+=i+" "+l(t,r+1),n<e.length-1&&(o+=","),o+="\n"})),o+=i+t.blue+"]"+t.reset,o}let a=t.green+"{"+t.reset;const s=Object.keys(e);return s.length&&(a+="\n"),s.forEach(((d,c)=>{const u=e[d],f=o(u);a+=i+" ","object"!=typeof u||null===u||Array.isArray(u)?Array.isArray(u)?a+=f+d+t.reset+": "+l(u,r+1):a+=f+d+": "+n(u)+t.reset:a+=f+d+t.reset+": "+l(u,r+1),c<s.length-1&&(a+=","),a+="\n"})),a+=i+t.green+"}"+t.reset,a}function r(e){if("undefined"==typeof document)return;let t,o=document.getElementById("alert-overlay");o||(o=document.body.appendChild(document.createElement("div")),o.id="alert-overlay",o.setAttribute("style","position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center"),o.innerHTML='<div id="alert-box" style="background:#fff;padding:1.5em 2em;border-radius:8px;box-shadow:0 2px 16px #0003;min-width:220px;max-height:80vh;position:relative;display:flex;flex-direction:column;">\n <button id="close-alert" style="position:absolute;top:12px;right:20px;font-size:1.5em;background:none;border:none;cursor:pointer;color:black;">×</button>\n <div id="alert-list" style="overflow:auto;flex:1;"></div>\n </div>',o.addEventListener("click",(e=>e.target==o&&o.remove())),document.getElementById("close-alert").onclick=()=>o.remove()),t=o.querySelector("#alert-list"),t.innerHTML+=`<div style="border-bottom:1px solid #333; font-size:1.2em;margin:0.5em 0;">${e}</div>`}async function i(t,o){var n,s,d,c,u,f,g,p,y,b,m,h;let{headers:w,response:v={},method:T=(o.post?"POST":o.put?"PUT":o.patch?"PATCH":"GET"),cache:S=!1,cacheForTime:x=60,timeout:L=30,baseURL:O="undefined"!=typeof process&&process.env.SERVER_API_URL||"/api/",cancelOngoingIfNew:E=!1,cancelNewIfOngoing:A=!1,rateLimit:j=0,debug:k=!1,infiniteScroll:P=null,setDefaults:N=!1,retryAttempts:q=0,logger:D=e,onRequest:J=null,onResponse:$=null,onError:F=null,onStream:I=null,repeatEvery:R=null,repeat:H=0,debounce:z=0,regrabOnStale:C=!1,regrabOnFocus:W=!1,regrabOnNetwork:M=!1,post:U=!1,put:_=!1,patch:B=!1,body:K=null,...G}={..."undefined"!=typeof window?null==(n=null==window?void 0:window.grab)?void 0:n.defaults:(null==(d=null==(s=global||globalThis)?void 0:s.grab)?void 0:d.defaults)||{},...o};t.startsWith("http:")||t.startsWith("https:")?O="":t.startsWith("/")||t.startsWith("http:")||O.endsWith("/")||(t="/"+t);try{if(z>0)return await a((async()=>{await i(t,{...o,debounce:0})}),1e3*z);if(H>1){for(let e=0;e<H;e++)await i(t,{...o,repeat:0});return v}if(R)return setInterval((async()=>{await i(t,{...o,repeat:0,repeatEvery:null})}),1e3*R),v;if(null==o?void 0:o.setDefaults)return void("undefined"!=typeof window?window.grab.defaults={...o,setDefaults:void 0}:void 0!==(global||globalThis).grab&&((global||globalThis).grab.defaults={...o,setDefaults:void 0}));if(void 0!==typeof window){const e=async()=>await i(t,{...o,cache:!1});C&&S&&setTimeout(e,1e3*x),M&&window.addEventListener("online",e),W&&(window.addEventListener("focus",e),document.addEventListener("visibilitychange",(async()=>{"visible"===document.visibilityState&&await e()})))}let e="function"==typeof v?v:null;v&&!e||(v={});var[V,Q,X]=P||[];if((null==P?void 0:P.length)&&"undefined"==typeof window){let e="string"==typeof X?document.querySelector(X):X;e&&e.removeEventListener("scroll",null==(c=window??globalThis)?void 0:c.scrollListener),(window??globalThis).scrollListener=e.addEventListener("scroll",(async({target:e})=>{const n=e;localStorage.setItem("scroll",JSON.stringify([n.scrollTop,n.scrollLeft,X])),n.scrollHeight-n.scrollTop<=n.clientHeight+200&&await i(t,{...o,cache:!1,[V]:(null==r?void 0:r.currentPage)+1})}))}let n=JSON.stringify(V?{...G,[V]:void 0}:G),r=null==(u=null==i?void 0:i.log)?void 0:u.find((e=>e.request==n&&e.path==t));if(V){let e=(null==r?void 0:r.currentPage)+1||(null==G?void 0:G[V])||1;r||(v[Q]=[],e=1),r&&(r.currentPage=e),G[V]=e}else{for(let e of Object.keys(v))v[e]=void 0;if(S&&(!x||(null==r?void 0:r.lastFetchTime)>Date.now()-1e3*x)){for(let e of Object.keys(r.res))v[e]=r.res[e];e&&(v=e(v))}}if(e?e({isLoading:!0}):"object"==typeof v&&(v.isLoading=!0),e&&(v=e(v)),j>0&&(null==r?void 0:r.lastFetchTime)&&r.lastFetchTime>Date.now()-1e3*j)throw new Error(`Fetch rate limit exceeded for ${t}. \n Wait ${j}s between requests.`);if(null==r?void 0:r.controller)if(E)r.controller.abort();else if(A)return{isLoading:!0};void 0!==i.log&&(null==(f=i.log)||f.unshift({path:t,request:n,lastFetchTime:Date.now(),controller:new AbortController}));let s={method:T,headers:{"Content-Type":"application/json",Accept:"application/json",...w},body:G.body,redirect:"follow",cache:S?"force-cache":"no-store",signal:E?null==(p=null==(g=i.log[0])?void 0:g.controller)?void 0:p.signal:AbortSignal.timeout(1e3*L)},d="";["POST","PUT","PATCH"].includes(T)?s.body=G.body||JSON.stringify(G):d=(Object.keys(G).length?"?":"")+new URLSearchParams(G).toString(),"function"==typeof J&&([t,v,G,s]=J(t,v,G,s));let h=null,N=new Date,q=null==(y=i.mock)?void 0:y[t],F=e=>new Promise((t=>setTimeout(t,1e3*e||0)));if(!q||q.params&&q.method!=T||q.params&&n!=JSON.stringify(q.params)){if(h=await fetch(O+t+d,s).catch((e=>{throw new Error(e)})),!h.ok)throw new Error(`HTTP error: ${h.status} ${h.statusText}`);let e=h.headers.get("content-type");I?await I(h.body):h=await(e?e.includes("application/json")?h&&h.json():e.includes("application/pdf")||e.includes("application/octet-stream")?h.blob():h.text():h.json()).catch((e=>{throw new Error("Error parsing response: "+e)}))}else await F(q.delay),h="function"==typeof q.response?q.response(G):q.response;"function"==typeof $&&([t,v,G,s]=$(t,v,G,s)),e?e({isLoading:void 0}):"object"==typeof v&&(null==v||delete v.isLoading),null==r||delete r.controller;const U=((Number(new Date)-Number(N))/1e3).toFixed(1);if(k&&D("Path:"+O+t+d+"\n"+JSON.stringify(o,null,2)+"\nTime: "+U+"s\nResponse: "+l(h)),void 0===h)return;if("object"==typeof h){for(let e of Object.keys(h))v[e]=Q==e&&(null==(b=v[e])?void 0:b.length)?[...v[e],...h[e]]:h[e];void 0!==v&&(v.data=h)}else e?e({data:h,...h}):"object"==typeof v&&(v.data=h);return void 0!==i.log&&(null==(m=i.log)||m.unshift({path:t,request:JSON.stringify({...G,paginateKey:void 0}),response:v,lastFetchTime:Date.now()})),e&&(v=e(v)),v}catch(Y){let e="Error: "+Y.message+"\nPath:"+O+t+"\n";return JSON.stringify(G),"function"==typeof F&&F(Y.message,O+t,G),o.retryAttempts>0?await i(t,{...o,retryAttempts:--o.retryAttempts}):(!Y.message.includes("signal")&&o.debug&&(D(e,"color: red;"),k&&void 0!==typeof document&&r(e)),v.error=Y.message,"function"==typeof v?(v.data=v({isLoading:void 0,error:Y.message}),v=v.data):null==v||delete v.isLoading,void 0!==i.log&&(null==(h=i.log)||h.unshift({path:t,request:JSON.stringify(G),error:Y.message})),v)}}i.instance=(e={})=>(t,o={})=>i(t,{...e,...o});const a=async(e,t)=>{let o;return async function(...n){clearTimeout(o),o=setTimeout((async()=>{clearTimeout(o),await e(...n)}),t)}};"undefined"!=typeof window?(window.log=e,window.grab=i,window.grab.log=[],window.grab.mock={},window.grab.defaults={},document.addEventListener("keydown",(e=>{if("i"===e.key&&e.ctrlKey){let e=" ";for(let t of grab.log)e+=`<div style="margin-bottom:1em; border-bottom:1px solid #ccc; padding-bottom:1em;">\n <b>Path:</b> ${t.path}<br>\n <b>Request:</b> ${t.request}<br>\n <b>Response:</b> ${JSON.stringify(t.response,null,2)}<br>\n <b>Time:</b> ${new Date(t.lastFetchTime).toLocaleString()}\n </div>`;r(e)}})),document.addEventListener("DOMContentLoaded",(()=>{let[e,t,o]=JSON.parse(localStorage.getItem("scroll"))||[];e&&(document.querySelector(o).scrollTop=e,document.querySelector(o).scrollLeft=t)}))):"undefined"!=typeof global?(i.log=[],i.mock={},i.defaults={},global.log=e,global.grab=i.instance()):"undefined"!=typeof globalThis&&(i.log=[],i.mock={},i.defaults={},globalThis.log=e,globalThis.grab=i.instance()),exports.default=i,exports.grab=i,exports.log=e,exports.printStructureJSON=l,exports.showAlert=r;
//# sourceMappingURL=grab-api.cjs.js.map