grab-url
Version:
📥 Generate Request to API from Browser
3 lines (2 loc) • 7.46 kB
JavaScript
;Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./log.cjs.js");async function t(r,i){var{headers:s,response:l={},method:a=(i?.post?"POST":i?.put?"PUT":i?.patch?"PATCH":"GET"),cache:d=!1,cacheForTime:c=60,timeout:u=30,baseURL:f="undefined"!=typeof process&&process.env.SERVER_API_URL||"/api/",cancelOngoingIfNew:p=!1,cancelNewIfOngoing:g=!1,rateLimit:m=0,debug:b=!1,infiniteScroll:y=null,setDefaults:w=!1,retryAttempts:h=0,logger:v=e.log,onRequest:T=null,onResponse:S=null,onError:L=null,onStream:x=null,repeatEvery:O=null,repeat:E=0,debounce:N=0,regrabOnStale:j=!1,regrabOnFocus:k=!1,regrabOnNetwork:P=!1,post:D=!1,put:q=!1,patch:J=!1,body:A=null,...F}={..."undefined"!=typeof window?window?.grab?.defaults:globalThis?.grab?.defaults||{},...i};let R=e=>r.startsWith(e);R("http:")||R("https:")?f="":R("/")||f.endsWith("/")?R("/")&&f.endsWith("/")&&(r=r.slice(1)):r="/"+r;try{if(N>0)return await o(async()=>{await t(r,{...i,debounce:0})},1e3*N);if(E>1){for(let e=0;e<E;e++)await t(r,{...i,repeat:0});return l}if(O)return setInterval(async()=>{await t(r,{...i,repeat:0,repeatEvery:null})},1e3*O),l;if(i?.setDefaults)return void("undefined"!=typeof window?window.grab.defaults={...i,setDefaults:void 0}:void 0!==globalThis.grab&&(globalThis.grab.defaults={...i,setDefaults:void 0}));if("undefined"!=typeof window){const e=async()=>await t(r,{...i,cache:!1});j&&d&&setTimeout(e,1e3*c),P&&window.addEventListener("online",e),k&&(window.addEventListener("focus",e),document.addEventListener("visibilitychange",async()=>{"visible"===document.visibilityState&&await e()}))}let n="function"==typeof l?l:null;l&&!n||(l={});var[$,I,H]=y||[];if(y?.length&&void 0!==H&&"undefined"!=typeof window){let o="string"==typeof H?document.querySelector(H):H;o?window.scrollListener&&void 0!==o&&"function"==typeof o.removeEventListener&&o.removeEventListener("scroll",window.scrollListener):e.log("paginateDOM not found",{color:"red"}),window.scrollListener=async e=>{const o=e.target;localStorage.setItem("scroll",JSON.stringify([o.scrollTop,o.scrollLeft,H])),o.scrollHeight-o.scrollTop<=o.clientHeight+200&&await t(r,{...i,cache:!1,[$]:h?.currentPage+1})},o&&o.addEventListener("scroll",window.scrollListener)}let w=JSON.stringify($?{...F,[$]:void 0}:F),h=t?.log?.find(e=>e.request==w&&e.path==r);if($){let e=h?.currentPage+1||F?.[$]||1;h||(l[I]=[],e=1),h&&(h.currentPage=e),F={...F,[$]:e}}else{for(let e of Object.keys(l))l[e]=void 0;if(d&&(!c||h?.lastFetchTime>Date.now()-1e3*c)){for(let e of Object.keys(h.res))l[e]=h.res[e];n&&(l=n(l))}}if(n?n({isLoading:!0}):"object"==typeof l&&(l.isLoading=!0),n&&(l=n(l)),m>0&&h?.lastFetchTime&&h.lastFetchTime>Date.now()-1e3*m)throw new Error(`Fetch rate limit exceeded for ${r}. \n Wait ${m}s between requests.`);if(h?.controller)if(p)h.controller.abort();else if(g)return{isLoading:!0};void 0!==t.log&&t.log?.unshift({path:r,request:w,lastFetchTime:Date.now(),controller:new AbortController});let L={method:a,headers:{"Content-Type":"application/json",Accept:"application/json",...s},body:F.body,redirect:"follow",cache:d?"force-cache":"no-store",signal:p?t.log[0]?.controller?.signal:AbortSignal.timeout(1e3*u)},D="";["POST","PUT","PATCH"].includes(a)?L.body=F.body||JSON.stringify(F):D=(Object.keys(F).length?"?":"")+new URLSearchParams(F).toString(),"function"==typeof T&&([r,l,F,L]=T(r,l,F,L));let q=null,J=new Date,A=t.mock?.[r],R=e=>new Promise(t=>setTimeout(t,1e3*e||0));if(!A||A.params&&A.method!=a||A.params&&w!=JSON.stringify(A.params)){if(q=await fetch(f+r+D,L).catch(e=>{throw new Error(e.message)}),!q.ok)throw new Error(`HTTP error: ${q.status} ${q.statusText}`);let e=q.headers.get("content-type");x?await x(q.body):q=await(e?e.includes("application/json")?q&&q.json():e.includes("application/pdf")||e.includes("application/octet-stream")?q.blob():q.text():q.json()).catch(e=>{throw new Error("Error parsing response: "+e)})}else await R(A.delay),q="function"==typeof A.response?A.response(F):A.response;"function"==typeof S&&([r,l,F,L]=S(r,l,F,L)),n?n({isLoading:void 0}):"object"==typeof l&&delete l?.isLoading,delete h?.controller;const C=((Number(new Date)-Number(J))/1e3).toFixed(1);if(b&&v("Path:"+f+r+D+"\n"+JSON.stringify(i,null,2)+"\nTime: "+C+"s\nResponse: "+e.printJSONStructure(q)),"object"==typeof q){for(let e of Object.keys(q))l[e]=I==e&&l[e]?.length?[...l[e],...q[e]]:q[e];void 0!==l&&(l.data=q)}else n?n({data:q,...q}):"object"==typeof l&&(l.data=q);return void 0!==t.log&&t.log?.unshift({path:r,request:JSON.stringify({...F,paginateKey:void 0}),response:l,lastFetchTime:Date.now()}),n&&(l=n(l)),l}catch(C){let e="Error: "+C.message+"\nPath:"+f+r+"\n";return void 0===l&&(l={}),"function"==typeof L&&L(C.message,f+r,F),i?.retryAttempts>0?await t(r,{...i,retryAttempts:--i.retryAttempts}):(!C.message.includes("signal")&&i?.debug&&(v(e,{color:"red"}),b&&"undefined"!=typeof document&&n(e)),l.error=C.message,"function"==typeof l?(l.data=l({isLoading:void 0,error:C.message}),l=l.data):delete l?.isLoading,void 0!==t.log&&t.log?.unshift({path:r,request:JSON.stringify(F),error:C.message}),l)}}t.instance=(e={})=>(o,n={})=>t(o,{...e,...n});const o=async(e,t)=>{let o;return async function(...n){clearTimeout(o),o=setTimeout(async()=>{clearTimeout(o),await e(...n)},t)}};function n(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>`}function r(){document.addEventListener("keydown",o=>{if("i"===o.key&&o.ctrlKey&&o.altKey){let o=" ";for(let n of t.log)o+=`<div style="margin-bottom:1em; border-bottom:1px solid #ccc; padding-bottom:1em;">\n <b>Path:</b> ${n.path}<br>\n <b>Request:</b> ${e.printJSONStructure(n.request,0,"html")}<br>\n <b>Response:</b> ${e.printJSONStructure(n.response,0,"html")}<br> \n <b>Time:</b> ${new Date(n.lastFetchTime).toLocaleString()}\n </div>`;n(o)}})}"undefined"!=typeof window?(window.log=e.log,window.grab=t,window.grab.log=[],window.grab.mock={},window.grab.defaults={},r(),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 globalThis&&(t.log=[],t.mock={},t.defaults={},globalThis.log=e.log,globalThis.grab=t.instance()),exports.log=e.log,exports.printJSONStructure=e.printJSONStructure,exports.default=t,exports.grab=t,exports.setupDevTools=r,exports.showAlert=n;
//# sourceMappingURL=grab-api.cjs.js.map