UNPKG

@svelkit/graphql

Version:

> A lightweight [GraphQL] client for [svelte]

7 lines (6 loc) 5.55 kB
import{writable as B,derived as z}from"svelte/store";import{setContext as W,getContext as J}from"svelte";import X from"fast-json-stable-stringify";export{default as gql}from"plain-tag";const K=e=>{const t=/(?:^|})\s*(?:(query|mutation|subscription)\s*(\w+)?\s*[({]|{)/m.exec(e)||[];return{type:t[1]||"query",name:t[2]}},k=Array.from({length:256},(e,t)=>(t>>4&15).toString(16)+(t&15).toString(16)),x=e=>k[e>>8]+k[e&255],v=65535,b=315,G=e=>{let t=e.length,r=0,s=0,i=0,c=0,f=0,n=0,a=0,g=0,u=5247,l=20042,y=11120,m=30865,d=36015,w=4122,C=52073,L=53800;for(;t--;)u^=e.charCodeAt(t),r=u*b,s=l*b,i=y*b,c=m*b,f=d*b,n=w*b,a=C*b,g=L*b,n+=u<<8,a+=l<<8,g+=y<<8,s+=r>>>16,u=r&v,i+=s>>>16,l=s&v,c+=i>>>16,y=i&v,f+=c>>>16,m=c&v,n+=f>>>16,d=f&v,a+=n>>>16,w=n&v,L=g+(a>>>16)&v,C=a&v;return x(L)+x(C)+x(w)+x(d)+x(m)+x(y)+x(l)+x(u)},Y=e=>({version:-1,fnv1a128Hash:G(e)}),D=({generateHash:e=Y,preferGETForHashedQueries:t=!0,notFoundError:r="PersistedQueryNotFound",notSupportedError:s="PersistedQueryNotSupported"}={})=>{const i=new Map,c=n=>{let a=i.get(n);return a||i.set(n,a=e(n)),a};let f=!0;return async({query:n,extensions:a,options:g,...u},l)=>{if(!f||!n||a.persistedQuery||u.operation.type!=="query")return l();const y=c(n),m=await l({...u,query:"",extensions:{...a,persistedQuery:y},options:{...g,preferGetForQueries:t||g.preferGetForQueries}}).catch(d=>{if(d.message===r||d.message===s)return{errors:[d]};throw d});return m.errors&&(f=m.errors.every(d=>d.message!==s),!f||m.errors.some(d=>d.message===r))?l({...u,query:n,extensions:a,options:g}):m}},T=e=>typeof e=="string";class R extends Error{constructor(e,t){super((T(t)?t:(t.errors||[])[0]?.message)||`[${e.status}] ${e.statusText}`);this.name="GraphQLFetchError",this.status=e.status,this.body=t,this.headers=e.headers}}const j=e=>e&&Object.keys(e).length>0?e:void 0,Z=2e3,N=e=>e.headers.get("Content-Type")?.startsWith("application/json"),M=(e={})=>async({operation:t,query:r,variables:s,extensions:i,options:c},f)=>{if(t.type==="query"||t.type==="mutation"){const{fetch:n=globalThis.fetch,uri:a="/graphql",preferGetForQueries:g,...u}={referrerPolicy:"strict-origin-when-cross-origin",...e,...c,headers:{Accept:"application/json",...e.headers,...c.headers}};let l;const y={operationName:t.name,query:r||void 0,variables:j(s),extensions:j(i)};if(g&&t.type==="query"){const m=new URL(a,document.baseURI);for(const[d,w]of Object.entries(y))w&&m.searchParams.set(d,T(w)?w:X(w));m.href.length<Z&&(l=await n(m.href,{...u,method:"GET"}))}if(l||(l=await n(new URL(a,document.baseURI).href,{...u,method:"POST",headers:{...u.headers,"Content-Type":"application/json"},body:JSON.stringify(y)})),l.ok&&N(l))return l.json();throw new R(l,await(N(l)?l.json():l.text()))}return f()};let o=0,p,h;const P=e=>` \r,`.includes(e),O=e=>"!|$&():=@[]{}.".includes(e),U=e=>e==="#",Q=e=>e==='"',A=e=>e==="\\"&&Q(h[o]),V=e=>e===` `||e==="\r"&&h[o]===` `&&(o+=1),F=()=>Q(h[o])&&Q(h[o+1])&&(o+=2),H=()=>{for(;o<h.length&&!V(h[o++]););},E=e=>{for(;o<h.length&&P(h[o]);)o++;return O(h[o])?h[o++]+E(""):U(h[o])?(H(),E(e)):Q(h[o])?"":e},ee=()=>{let e="";for(;o<h.length;)if(p=h[o++],Q(p)){if(F())break;e+="\\"+p}else e+=p,A(p)&&(e+=h[o++]);const t=e.replace(/^(?:\s*\r?\n)*|(?:\r?\n\s*)*$/g,"").split(/\r?\n/),r=t.reduce((s,i)=>{if(!i)return s;let c=0;for(;P(i[c])&&s[c]===i[c];)c+=1;return s.slice(0,c)},/^(\s*)/.exec(t[0])?.[1]||"").length;return t.map(s=>s.slice(r)).join(` `)},te=()=>{let e="";for(;o<h.length&&!(p=h[o++],Q(p));)e+=p,A(p)&&(e+=h[o++]);return e},se=e=>{o=0,h=e;let t="";for(;o<h.length;)p=h[o++],P(p)?t+=E(" "):U(p)?H():(t+=p,O(p)?t+=E(""):Q(p)&&(t+=(F()?ee():te())+p));return t.trim()},I=()=>{const e=new Map,t=r=>{let s=e.get(r);return s||e.set(r,s=se(r)),s};return(r,s)=>s({...r,query:t(r.query)})},_=[I()];class re extends Error{constructor(e,t){super(e?.[0]?.message||"GraphQL Error");this.name="GraphQLClientError",this.errors=e,this.extensions=t}}const ne=({fetching:e,error:t,data:r,errors:s,extensions:i})=>({fetching:Boolean(e),data:r,error:t||s&&new re(s,i),extensions:i});class ie{constructor({exchanges:e=_,...t}){this.lastId=0,this.exchanges=e.filter(Boolean),this.exchanges.push(M()),this.options=t}setHeader(e,t){const r={...this.options.headers,[e]:t||""};return t||delete r[e],this.options={...this.options,headers:r},r[e]}request(e,t,r={}){const s=B({},i=>{const c=new AbortController;i({fetching:!0});const f=(n,a)=>{const g=this.exchanges[a];if(g)return g(n,(u=n)=>f(u,a+1),s.update);throw new Error(`No exchange has handled operations of type "${n.operation.type}". Check whether you've added an exchange responsible for these operations.`)};return f({query:e,variables:t||{},operation:{...K(e),id:++this.lastId},extensions:{},options:{...this.options,...r,headers:{...this.options.headers,...r.headers},signal:c.signal}},0).catch(n=>({error:n})).then(n=>s.set({...n,fetching:!1})),()=>c.abort()});return z(s,ne)}}const $=Symbol.for("@svelkit/graphql/client"),oe=e=>{const t=new ie(e);return W($,t),t},q=()=>J($),ae=e=>new Promise((t,r)=>{const s=e.subscribe(i=>{i.data?(s(),t(i)):i.error&&(s(),r(i.error))})}),S=(e,t={},r={})=>{const s=q(),i=(f,n)=>{const a=s.request(e,{...t,...f},{...r,...n});return a.then=ce,a.fetch=(g,u)=>i({...f,...g},{...n,...u}),a},c=i();return Object.assign(c.fetch,c)};function ce(e,t){return ae(this).then(e,t)}export{R as GraphQLFetchError,D as automaticPersistedQueries,_ as defaultExchanges,M as fetch,G as fnv1a128,oe as initGraphQLClient,I as minimize,q as useGraphQLClient,S as useMutation,S as useQuery,S as useRequest}; //# sourceMappingURL=graphql.js.map