@symbo.ls/fetch 3.14.402 → 3.14.589
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +10 -5
- package/dist/cjs/index.js +1 -1
- package/dist/esm/index.js +1 -1
- package/index.js +29 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -4,17 +4,17 @@ Declarative data fetching for DOMQL with pluggable adapters. Supports caching, s
|
|
|
4
4
|
|
|
5
5
|
## Setup
|
|
6
6
|
|
|
7
|
-
Add `
|
|
7
|
+
Add `fetch` to `config.js` — this is the connection/adapter config (distinct from the per-element `fetch` query declaration; the runtime resolves it onto `context.fetch`):
|
|
8
8
|
|
|
9
9
|
```js
|
|
10
10
|
// Supabase
|
|
11
|
-
|
|
11
|
+
fetch: { adapter: 'supabase', projectId: '...', key: '...' }
|
|
12
12
|
|
|
13
13
|
// Supabase — config from state
|
|
14
|
-
|
|
14
|
+
fetch: { adapter: 'supabase', state: 'supabase' } // merges root state.supabase
|
|
15
15
|
|
|
16
16
|
// REST
|
|
17
|
-
|
|
17
|
+
fetch: {
|
|
18
18
|
adapter: 'rest',
|
|
19
19
|
url: 'https://api.example.com',
|
|
20
20
|
headers: { Authorization: 'Bearer token' },
|
|
@@ -28,9 +28,14 @@ db: {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
// Local
|
|
31
|
-
|
|
31
|
+
fetch: { adapter: 'local', data: { articles: [] }, persist: true }
|
|
32
|
+
|
|
33
|
+
// Custom/registered adapter (see Registering a named adapter)
|
|
34
|
+
fetch: { adapter: 'sdk', sdk: getSDK() }
|
|
32
35
|
```
|
|
33
36
|
|
|
37
|
+
> `db` is **not** a config key — it's the local name for the resolved adapter you get from `await this.getDB()` (`db.select(...)`, `db.insert(...)`, …).
|
|
38
|
+
|
|
34
39
|
## Declarative `fetch`
|
|
35
40
|
|
|
36
41
|
```js
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Mt=Object.create;var rt=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var It=Object.getPrototypeOf,$t=Object.prototype.hasOwnProperty;var Ot=(t,e)=>{for(var s in e)rt(t,s,{get:e[s],enumerable:!0})},vt=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Nt(e))!$t.call(t,o)&&o!==s&&rt(t,o,{get:()=>e[o],enumerable:!(r=Rt(e,o))||r.enumerable});return t};var pt=(t,e,s)=>(s=t!=null?Mt(It(t)):{},vt(e||!t||!t.__esModule?rt(s,"default",{value:t,enumerable:!0}):s,t)),qt=t=>vt(rt({},"__esModule",{value:!0}),t);var se={};Ot(se,{createAdapter:()=>Qt,default:()=>ee,executeFetch:()=>wt,fetchPlugin:()=>te,initAdapterAuth:()=>ct,parseDuration:()=>W,queryClient:()=>Zt,registerAdapter:()=>Gt,resolveDb:()=>At});module.exports=qt(se);var f=require("@symbo.ls/utils");const Ut=["select","rpc","insert","update","delete","subscribe"],zt={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},at=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),Y=(()=>{if(typeof globalThis<"u"&&globalThis[at])return globalThis[at];const t={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,at,{value:t,writable:!1,configurable:!1,enumerable:!1}),globalThis[at]}catch{}return t})(),it=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),_t=(()=>{if(typeof globalThis<"u"&&globalThis[it])return globalThis[it];const t={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,it,{value:t,writable:!1,configurable:!1,enumerable:!1}),globalThis[it]}catch{}return t})(),xt=5e3,jt=t=>new Promise(e=>{if(Y[t])return e(Y[t]);const s=_t[t]||=[];let r=!1;const o=()=>{r||(r=!0,e(Y[t]||null))};s.push(o),setTimeout(o,xt)}),Gt=(t,e)=>{Y[t]=e;const s=_t[t];if(s&&s.length){_t[t]=[];for(const r of s)r()}},Qt=t=>{const e={};for(const s of Ut)t[s]&&(e[s]=t[s]);return e.name=t.name||"custom",e},At=async t=>{if(!t)return null;if(typeof t.select=="function")return t;const{adapter:e,...s}=t,r=typeof e=="string"?e:typeof t=="string"?t:null;if(!r)return null;let o=Y[r]||zt[r];if(!o&&(o=await jt(r),!o))throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await o();if(!a||typeof a.setup!="function")throw new Error(`Adapter "${r}" loader returned a module without a setup() function. Got keys: [${Object.keys(a||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return a.setup(s)},W=t=>{if(!t)return 0;if(typeof t=="number")return t;const e=t.match(/^(\d+)(ms|s|m|h)$/);if(!e)return 0;const s=parseInt(e[1]),r=e[2];return r==="ms"?s:r==="s"?s*1e3:r==="m"?s*6e4:r==="h"?s*36e5:0},w=new Map,U=new Map,B=new Map,Wt=(t,e)=>{if(t.cache?.key)return t.cache.key;const s=Bt(t.params),r=`${t.from}:${t.method}:${JSON.stringify(s||"")}`;return e?`${r}:${e}`:r},J=t=>w.get(t)||null,H=(t,e,s)=>{const r=w.get(t),o={data:e,error:s,time:Date.now(),stale:!1};w.set(t,o);const a=U.get(t);if(a)for(const i of a)(0,f.isFunction)(i)&&i(o);return o},V=t=>{if(t){const e=w.get(t);e&&(e.stale=!0);return}for(const[,e]of w)e.stale=!0},ot=t=>{if(t){w.delete(t);return}w.clear()},oe=(t,e)=>(U.has(t)||U.set(t,new Set),U.get(t).add(e),()=>{const s=U.get(t);s&&(s.delete(e),s.size===0&&U.delete(t))}),yt=t=>!t&&t!==!1?{staleTime:6e4,gcTime:3e5}:t===!1?null:t===!0?{staleTime:6e4,gcTime:3e5}:typeof t=="number"?{staleTime:t,gcTime:Math.max(t*5,3e5)}:(0,f.isString)(t)?{staleTime:W(t),gcTime:3e5}:{staleTime:W(t.stale||t.staleTime)||6e4,gcTime:W(t.gc||t.gcTime||t.expire)||3e5,key:t.key};let nt=null;const Kt=()=>{nt||(nt=setInterval(()=>{const t=Date.now();for(const[e,s]of w){const r=U.get(e);!(r&&r.size>0)&&t-s.time>(s.gcTime||3e5)&&w.delete(e)}},3e4),nt.unref&&nt.unref())};Kt();const Tt=3,gt=t=>Math.min(1e3*2**t,3e4),Ft=t=>{const e=t.retry;return e===!1?{count:0}:e===!0||e===void 0?{count:Tt,delay:gt}:typeof e=="number"?{count:e,delay:gt}:{count:e.count??Tt,delay:(0,f.isFunction)(e.delay)?e.delay:typeof e.delay=="number"?()=>e.delay:gt}},Et=async(t,e)=>{const{count:s,delay:r}=e;let o;for(let a=0;a<=s;a++)try{const i=await t();if(i?.error){if(o=i.error,a<s){const c=(0,f.isFunction)(r)?r(a,o):r;await new Promise(n=>setTimeout(n,c));continue}return i}return i}catch(i){if(o=i,a<s){const c=(0,f.isFunction)(r)?r(a,i):r;await new Promise(n=>setTimeout(n,c));continue}throw i}return{data:null,error:o}},Q={focus:new Set,online:new Set};let Dt=!1;const Yt=()=>{if(Dt||typeof window>"u")return;Dt=!0;const t=()=>{for(const s of Q.focus)s()},e=()=>{for(const s of Q.online)s()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&t()}),window.addEventListener("focus",t),window.addEventListener("online",e)},Ct=(t,e)=>{const s=e.__ref;if(t===!0)return{from:s.__state||e.key,method:"select",query:!0,on:"create"};if((0,f.isString)(t))return{from:t,method:"select",query:!0,on:"create"};if((0,f.isObject)(t)){const r={...t};return r.from=r.from||s.__state||e.key,r.method=r.method||"select",r.on=r.on||"create",r.query===void 0&&(r.query=!0),r}return null},Bt=t=>(!t||(0,f.isFunction)(t),t),ft=(t,e)=>{const s=t?.state?.root||e?.state?.root;if(s?.lang)return s.lang},Pt=(t,e,s)=>{let r;if(!t)r=void 0;else if((0,f.isFunction)(t))r=t(e,e.state);else{r={};for(const o in t){const a=t[o];r[o]=(0,f.isFunction)(a)?a(e,e.state):a}}return r},ct=async(t,e)=>{if(!t||t.__authInitialized||(t.__authInitialized=!0,!t.getSession))return;const s=(r,o)=>{const a=e.state?.root;a?.update&&a.update({auth:{user:r,session:o,loading:!1}})};try{const r=await t.getSession();s(r?.user||null,r)}catch(r){console.warn("[fetch] Failed to restore auth session:",r.message)}t.onAuthStateChange&&t.onAuthStateChange((r,o)=>{s(o?.user||null,o)})},St=async(t,e)=>{if((0,f.isFunction)(t.select))return t.auth!==!1&&await ct(t,e),t;if(t.__resolved)return t.auth!==!1&&await ct(t.__resolved,e),t.__resolved;if(t.__resolving)return t.__resolving;t.__resolving=At(t);const s=await t.__resolving;return delete t.__resolving,s?(s.auth=t.auth,s.url=t.url,s.key=t.key,t.__resolved=s,e.fetch=s,t.auth!==!1&&await ct(s,e),s):null},v=(t,e,...s)=>{const r=(0,f.isFunction)(t[e])?t[e]:null;r&&r.call(t,...s,t,t.state,t.context)},C=(t,e,s,...r)=>{const o=t&&(0,f.isFunction)(t[s])?t[s]:null;o&&o.call(e,...r,e,e.state,e.context)},X=t=>{const e={},s=t.node;if(!s)return e;if(s.tagName==="FORM"){const o=new FormData(s);for(const[a,i]of o.entries())e[a]=i;return e}const r=s.querySelectorAll("input, textarea, select");for(let o=0;o<r.length;o++){const a=r[o],i=a.name||a.getAttribute("name");i&&(a.type==="checkbox"?e[i]=a.checked:a.type==="file"?e[i]=a.files:e[i]=a.value)}return e},z=(t,e,s,r={})=>{const o=s&&s.startsWith("~/"),a=o&&t.state?.root||t.state;if(a?.update)if(o){const i=s.slice(2);e&&typeof e=="object"&&!Array.isArray(e)&&i in e?a.update(e,{preventFetch:!0,...r}):a.update({[i]:e},{preventFetch:!0,...r})}else{const i=s?{[s]:e}:e;a.update(i,{preventFetch:!0,...r})}},k=(t,e)=>{const s=t?.__ref;s&&(s.__fetchStatus=e,s.__fetching=e.isFetching,s.__fetchError=e.error)},$=async(t,e,s,r={})=>{const o=s?.fetch;if(!o||!e||!e.__ref||t.enabled===!1||(0,f.isFunction)(t.enabled)&&!t.enabled(e,e.state)||t.skip===!0||(0,f.isFunction)(t.skip)&&t.skip(e,e.state))return;const a=await St(o,s);if(!a||!e.__ref)return;const i=e.__ref,{from:c,method:n,query:y,params:T,cache:Z,transform:F,single:ut,auth:tt,fields:N,as:O,limit:K,offset:et,order:x,headers:I,baseUrl:_,page:g,cursor:m,getNextPageParam:j,getPreviousPageParam:S,infinite:P,placeholderData:q,initialData:G,select:A,keepPreviousData:M}=t;let E=(0,f.isString)(A)?A:void 0;if(y&&(0,f.isFunction)(e.getQuery)){const d=e.getQuery(a.name||"paths");d&&(E=d.select||d.length&&d.join(",")||E)}const L=Pt(T,e,s),D=yt(Z),st=Ft(t),lt=ft(e,s),Lt=lt?`:${lt}`:"",p=D?Z?.key||`${c}:${n}:${JSON.stringify(L||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${Lt}`:null;if(!i.__fetchInitialized&&p&&(i.__fetchInitialized=!0,G!==void 0)){const d=(0,f.isFunction)(G)?G():G;H(p,d,null)}if((n==="select"||n==="rpc")&&p&&D){const d=J(p);if(d&&!d.error){const l=Date.now()-d.time,h=d.stale||l>(D.staleTime||0);let u=d.data;if((0,f.isFunction)(A)&&(u=A(u,e,e.state)),F&&(u=F(u,e,e.state)),z(e,u,O),!h){k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(q!==void 0){const l=(0,f.isFunction)(q)?q(e,e.state):q;l!==void 0&&z(e,l,O)}}if(p&&B.has(p)&&!r.force){const d=B.get(p);try{const l=await Promise.race([d,new Promise((h,u)=>setTimeout(()=>u("DEDUP_TIMEOUT"),15e3))]);if(l?.data!==void 0){let h=l.data;(0,f.isFunction)(A)&&(h=A(h,e,e.state)),F&&(h=F(h,e,e.state)),z(e,h,O),v(e,"onFetchComplete",h),C(t,e,"onFetchComplete",h)}}catch{}return}const kt=!J(p)?.data;k(e,{isFetching:!0,isLoading:kt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(e,"onFetchStart"),C(t,e,"onFetchStart");const R=s?.analyze?.emitNetwork,dt=R?typeof performance<"u"?performance.now():Date.now():0;R&&R({phase:"start",mode:"query",from:c,method:n,cacheKey:p,lang:lt});const mt=Et(async()=>{if(tt!==!1&&a.auth!==!1&&a.getSession){const u=await a.getSession();if(tt===!0&&!u){const b={message:"Not authenticated"};return k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:b,status:"error",fetchStatus:"idle"}),v(e,"onFetchError",b),C(t,e,"onFetchError",b),{data:null,error:b}}}const d=a[n];if(!(0,f.isFunction)(d))return{data:null,error:{message:`Method "${n}" not found on adapter`}};const l={from:c,select:E,params:L,single:ut,limit:K,offset:et,order:x,headers:I,baseUrl:_},h=ft(e,s);if(h&&(l.headers={...l.headers,"Accept-Language":h}),g!==void 0){if((0,f.isObject)(g))g.offset!==void 0&&(l.offset=g.offset),g.limit!==void 0&&(l.limit=g.limit),g.cursor!==void 0&&(l.params={...l.params,cursor:g.cursor});else if(typeof g=="number"){const u=t.pageSize||K||20;l.offset=(g-1)*u,l.limit=u}}if(m!==void 0&&(l.params={...l.params,cursor:m}),n==="insert"||n==="update"||n==="upsert"){let u;if(N===!0||t.on==="submit")u=X(e);else if((0,f.isArray)(N)){const b=X(e);u={};for(const ht of N)u[ht]=b[ht]}else e.state?.parse?u=e.state.parse():(0,f.isObject)(e.state)&&(u={...e.state});F&&(u=F(u,e,e.state)),l.data=u}if(n==="rpc"){let u=L;if(t.on==="submit"){const b=X(e);u=t.transformParams?t.transformParams(b,e,e.state):b}l.params=u}if(n==="subscribe"){const u=a.subscribe({from:c,params:L,on:t.subscribeOn},(b,ht,ae)=>{z(e,b,O),v(e,"onFetchComplete",b),C(t,e,"onFetchComplete",b)});return i.__unsubscribe=u,{data:null,error:null,subscribed:!0}}return d(l)},st);p&&B.set(p,mt);try{const d=await mt;if(d?.subscribed)return;const{data:l,error:h}=d||{};if(h){p&&H(p,null,h),k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),v(e,"onFetchError",h),C(t,e,"onFetchError",h),R&&R({phase:"error",mode:"query",from:c,method:n,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-dt});return}if(l!==void 0){if((n==="select"||n==="rpc")&&p){const b=H(p,l,null);b.gcTime=D?.gcTime||3e5}let u=l;P&&(0,f.isArray)(l)&&(i.__pages||(i.__pages=[]),r.direction==="previous"?i.__pages.unshift(l):i.__pages.push(l),u=i.__pages.flat(),j&&(i.__nextPageParam=j(l,i.__pages),i.__hasNextPage=i.__nextPageParam!=null),S&&(i.__prevPageParam=S(l,i.__pages),i.__hasPreviousPage=i.__prevPageParam!=null)),(0,f.isFunction)(A)&&(u=A(u,e,e.state)),F&&(u=F(u,e,e.state)),(!M||u!==void 0)&&z(e,u,O),k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(e,"onFetchComplete",u),C(t,e,"onFetchComplete",u),R&&R({phase:"success",mode:"query",ok:!0,from:c,method:n,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-dt})}}catch(d){k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),v(e,"onFetchError",d),C(t,e,"onFetchError",d),R&&R({phase:"error",mode:"query",from:c,method:n,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-dt})}finally{p&&B.delete(p)}},Jt=(t,e,s)=>{const r=t.on,o=e.__ref;o.__fetchListeners||(o.__fetchListeners=[]);const a=t.__runner||$;if(r==="submit"){const i=n=>{n.preventDefault(),a(t,e,s)},c=e.node;c&&(c.addEventListener("submit",i),o.__fetchListeners.push(()=>c.removeEventListener("submit",i)))}else if(r==="click"){const i=()=>a(t,e,s),c=e.node;c&&(c.addEventListener("click",i),o.__fetchListeners.push(()=>c.removeEventListener("click",i)))}else r==="stateChange"&&(o.__fetchOnStateChange=()=>a(t,e,s))},Ht=(t,e,s)=>{const r=e.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),Yt();const o=t.refetchInterval;if(o){const a=typeof o=="number"?o:W(o);if(a>0){const i=setInterval(()=>{(t.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&$(t,e,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(i))}}if(t.refetchOnWindowFocus!==!1){const a=()=>{const i=ft(e,s),c=Wt(t,i),n=J(c),y=yt(t.cache);(!n||n.stale||Date.now()-n.time>(y?.staleTime||0))&&$(t,e,s,{force:!0})};Q.focus.add(a),r.__fetchCleanups.push(()=>Q.focus.delete(a))}if(t.refetchOnReconnect!==!1){const a=()=>$(t,e,s,{force:!0});Q.online.add(a),r.__fetchCleanups.push(()=>Q.online.delete(a))}},Vt=(t,e,s)=>{if(!e.optimistic)return null;const r=t.__ref,o=e.as,a=t.state?.parse?t.state.parse():(0,f.isObject)(t.state)?{...t.state}:t.state;r.__optimisticSnapshot=a;const i=(0,f.isFunction)(e.optimistic)?e.optimistic(s,a,t):e.optimistic;return i!==void 0&&z(t,i,o),a},bt=(t,e)=>{const s=t.__ref,r=s.__optimisticSnapshot;r!==void 0&&(z(t,r,e.as),delete s.__optimisticSnapshot)},Xt=async(t,e,s)=>{const r=s?.fetch;if(!r)return;const o=await St(r,s);if(!o)return;const a=e.__ref,{method:i,from:c,fields:n,transform:y,as:T,on:Z,auth:F,headers:ut,baseUrl:tt,invalidates:N,optimistic:O,onMutate:K,onSuccess:et,onError:x,onSettled:I}=t;let _;if(n===!0||Z==="submit")_=X(e);else if((0,f.isArray)(n)){const S=X(e);_={};for(const P of n)_[P]=S[P]}else e.state?.parse?_=e.state.parse():(0,f.isObject)(e.state)&&(_={...e.state});y&&(_=y(_,e,e.state)),(0,f.isFunction)(K)&&K(_,e,e.state);const g=O?Vt(e,t,_):null;a.__fetching=!0,k(e,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(e,"onFetchStart"),C(t,e,"onFetchStart");const m=s?.analyze?.emitNetwork,j=m?typeof performance<"u"?performance.now():Date.now():0;m&&m({phase:"start",mode:"mutation",from:c,method:i});try{if(F!==!1&&o.auth!==!1&&o.getSession){const L=await o.getSession();if(F===!0&&!L){g!==void 0&&bt(e,t);const D={message:"Not authenticated"};v(e,"onFetchError",D),C(t,e,"onFetchError",D);return}}const S=o[i];if(!(0,f.isFunction)(S))return;const P={from:c,data:_,headers:ut,baseUrl:tt};t.params&&(P.params=Pt(t.params,e,s));const q=ft(e,s);q&&(P.headers={...P.headers,"Accept-Language":q});const G=Ft(t),A=await Et(()=>S(P),G),{data:M,error:E}=A||{};if(E){g!==void 0&&bt(e,t),k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:E,status:"error",fetchStatus:"idle"}),v(e,"onFetchError",E),(0,f.isFunction)(x)&&x(E,_,e),(0,f.isFunction)(I)&&I(null,E,_,e),m&&m({phase:"error",mode:"mutation",from:c,method:i,error:E.message||String(E),durationMs:(typeof performance<"u"?performance.now():Date.now())-j});return}if(delete a.__optimisticSnapshot,M!==void 0){const L=T?{[T]:M}:M;e.state?.update&&e.state.update(L,{preventFetch:!0})}if(k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(e,"onFetchComplete",M),C(t,e,"onFetchComplete",M),(0,f.isFunction)(et)&&et(M,_,e),(0,f.isFunction)(I)&&I(M,null,_,e),m&&m({phase:"success",mode:"mutation",ok:!0,from:c,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-j}),N){const L=(0,f.isArray)(N)?N:[N];for(const D of L)if(D===!0||D==="*")for(const[st]of w)st.startsWith(c+":")&&V(st);else V(D)}}catch(S){g!==void 0&&bt(e,t),k(e,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),v(e,"onFetchError",S),C(t,e,"onFetchError",S),(0,f.isFunction)(x)&&x(S,_,e),(0,f.isFunction)(I)&&I(null,S,_,e),m&&m({phase:"error",mode:"mutation",from:c,method:i,error:S.message||String(S),durationMs:(typeof performance<"u"?performance.now():Date.now())-j})}finally{a.__fetching=!1}},wt=(t,e,s,r)=>{if(!t||!r?.fetch)return;const a=(0,f.exec)(t,e);if(!a)return;const i=(0,f.isArray)(a)?a.map(n=>Ct((0,f.exec)(n,e),e)).filter(Boolean):[Ct(a,e)].filter(Boolean);for(const n of i){const y=n.method==="insert"||n.method==="update"||n.method==="upsert"||n.method==="delete",T=y?Xt:$;n.on==="create"?T(n,e,r):Promise.resolve().then(()=>{Jt({...n,__runner:T},e,r)}),!y&&n.on==="create"&&(n.refetchInterval||n.refetchOnWindowFocus!==!1||n.refetchOnReconnect!==!1)&&Ht(n,e,r)}const c=e.__ref;c.refetch=n=>{for(const y of i)$(y,e,r,{force:!0,...n})},c.fetchNextPage=()=>{const n=i[0];if(!n||!n.infinite)return;const y=c.__nextPageParam;if(y==null)return;const T={...n,cursor:y};$(T,e,r,{direction:"next",force:!0})},c.fetchPreviousPage=()=>{const n=i[0];if(!n||!n.infinite)return;const y=c.__prevPageParam;if(y==null)return;const T={...n,cursor:y};$(T,e,r,{direction:"previous",force:!0})}},Zt={invalidateQueries:t=>{if(!t){V();return}if((0,f.isString)(t))for(const[e]of w)(e.startsWith(t)||e.includes(t))&&V(e);else if((0,f.isArray)(t)){const e=t.join(":");for(const[s]of w)s.includes(e)&&V(s)}},removeQueries:t=>{if(!t){ot();return}if((0,f.isString)(t))for(const[e]of w)(e.startsWith(t)||e.includes(t))&&ot(e)},getQueryData:t=>J(t)?.data??void 0,setQueryData:(t,e)=>{const s=J(t),r=(0,f.isFunction)(e)?e(s?.data):e;H(t,r,null)},prefetchQuery:async(t,e)=>{const s=e?.fetch;if(!s)return;const r=await St(s,e);if(!r)return;const o=t.cache?.key||`${t.from}:${t.method||"select"}:${JSON.stringify(t.params||"")}`,a=r[t.method||"select"];if(!(0,f.isFunction)(a))return;const i=await a({from:t.from,params:t.params,limit:t.limit,offset:t.offset,order:t.order,single:t.single});if(i?.data!==void 0&&!i?.error){const c=H(o,i.data,null);c.gcTime=yt(t.cache)?.gcTime||3e5}return i},getCache:()=>w,clear:()=>ot(),dropNonLang:t=>{if(!t)return;const e=`:${t}`;for(const[s]of w)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(e)||ot(s))}},te={name:"fetch",create(t){const e=t.fetch;e&&(t.parent||B.clear(),wt(e,t,t.state,t.context))}};var ee=wt;
|
|
1
|
+
"use strict";var Nt=Object.create;var rt=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var Ot=Object.getOwnPropertyNames;var qt=Object.getPrototypeOf,Ut=Object.prototype.hasOwnProperty;var zt=(e,t)=>{for(var s in t)rt(e,s,{get:t[s],enumerable:!0})},Tt=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ot(t))!Ut.call(e,o)&&o!==s&&rt(e,o,{get:()=>t[o],enumerable:!(r=It(t,o))||r.enumerable});return e};var pt=(e,t,s)=>(s=e!=null?Nt(qt(e)):{},Tt(t||!e||!e.__esModule?rt(s,"default",{value:e,enumerable:!0}):s,e)),jt=e=>Tt(rt({},"__esModule",{value:!0}),e);var oe={};zt(oe,{createAdapter:()=>Yt,default:()=>ae,executeFetch:()=>wt,fetchPlugin:()=>re,initAdapterAuth:()=>ct,parseDuration:()=>W,queryClient:()=>se,registerAdapter:()=>Kt,resolveDb:()=>kt});module.exports=jt(oe);var f=require("@symbo.ls/utils");const Gt=["select","rpc","insert","update","delete","subscribe"],Qt={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},at=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),Y=(()=>{if(typeof globalThis<"u"&&globalThis[at])return globalThis[at];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,at,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[at]}catch{}return e})(),ot=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),_t=(()=>{if(typeof globalThis<"u"&&globalThis[ot])return globalThis[ot];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ot,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ot]}catch{}return e})(),xt=5e3,Wt=e=>new Promise(t=>{if(Y[e])return t(Y[e]);const s=_t[e]||=[];let r=!1;const o=()=>{r||(r=!0,t(Y[e]||null))};s.push(o),setTimeout(o,xt)}),Kt=(e,t)=>{Y[e]=t;const s=_t[e];if(s&&s.length){_t[e]=[];for(const r of s)r()}},Yt=e=>{const t={};for(const s of Gt)e[s]&&(t[s]=e[s]);return t.name=e.name||"custom",t},kt=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...s}=e,r=typeof t=="string"?t:typeof e=="string"?e:null;if(!r)return null;let o=Y[r]||Qt[r];if(!o&&(o=await Wt(r),!o))throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await o();if(!a||typeof a.setup!="function")throw new Error(`Adapter "${r}" loader returned a module without a setup() function. Got keys: [${Object.keys(a||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return a.setup(s)},W=e=>{if(!e)return 0;if(typeof e=="number")return e;const t=e.match(/^(\d+)(ms|s|m|h)$/);if(!t)return 0;const s=parseInt(t[1]),r=t[2];return r==="ms"?s:r==="s"?s*1e3:r==="m"?s*6e4:r==="h"?s*36e5:0},w=new Map,U=new Map,B=new Map,Bt=(e,t,s)=>{if(e.cache?.key)return e.cache.key;const r=Vt(e.params),o=s?`${s}:`:"",a=`${e.from}:${e.method}:${o}${JSON.stringify(r||"")}`;return t?`${a}:${t}`:a},J=e=>w.get(e)||null,H=(e,t,s)=>{const r=w.get(e),o={data:t,error:s,time:Date.now(),stale:!1};w.set(e,o);const a=U.get(e);if(a)for(const i of a)(0,f.isFunction)(i)&&i(o);return o},V=e=>{if(e){const t=w.get(e);t&&(t.stale=!0);return}for(const[,t]of w)t.stale=!0},it=e=>{if(e){w.delete(e);return}w.clear()},ce=(e,t)=>(U.has(e)||U.set(e,new Set),U.get(e).add(t),()=>{const s=U.get(e);s&&(s.delete(t),s.size===0&&U.delete(e))}),yt=e=>!e&&e!==!1?{staleTime:6e4,gcTime:3e5}:e===!1?null:e===!0?{staleTime:6e4,gcTime:3e5}:typeof e=="number"?{staleTime:e,gcTime:Math.max(e*5,3e5)}:(0,f.isString)(e)?{staleTime:W(e),gcTime:3e5}:{staleTime:W(e.stale||e.staleTime)||6e4,gcTime:W(e.gc||e.gcTime||e.expire)||3e5,key:e.key};let nt=null;const Jt=()=>{nt||(nt=setInterval(()=>{const e=Date.now();for(const[t,s]of w){const r=U.get(t);!(r&&r.size>0)&&e-s.time>(s.gcTime||3e5)&&w.delete(t)}},3e4),nt.unref&&nt.unref())};Jt();const Ft=3,gt=e=>Math.min(1e3*2**e,3e4),Et=e=>{const t=e.retry;return t===!1?{count:0}:t===!0||t===void 0?{count:Ft,delay:gt}:typeof t=="number"?{count:t,delay:gt}:{count:t.count??Ft,delay:(0,f.isFunction)(t.delay)?t.delay:typeof t.delay=="number"?()=>t.delay:gt}},Dt=async(e,t)=>{const{count:s,delay:r}=t;let o;for(let a=0;a<=s;a++)try{const i=await e();if(i?.error){if(o=i.error,a<s){const c=(0,f.isFunction)(r)?r(a,o):r;await new Promise(n=>setTimeout(n,c));continue}return i}return i}catch(i){if(o=i,a<s){const c=(0,f.isFunction)(r)?r(a,i):r;await new Promise(n=>setTimeout(n,c));continue}throw i}return{data:null,error:o}},x={focus:new Set,online:new Set};let Ct=!1;const Ht=()=>{if(Ct||typeof window>"u")return;Ct=!0;const e=()=>{for(const s of x.focus)s()},t=()=>{for(const s of x.online)s()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},Pt=(e,t)=>{const s=t.__ref;if(e===!0)return{from:s.__state||t.key,method:"select",query:!0,on:"create"};if((0,f.isString)(e))return{from:e,method:"select",query:!0,on:"create"};if((0,f.isObject)(e)){const r={...e};return r.from=r.from||s.__state||t.key,r.method=r.method||"select",r.on=r.on||"create",r.query===void 0&&(r.query=!0),r}return null},Vt=e=>(!e||(0,f.isFunction)(e),e),ft=(e,t)=>{const s=e?.state?.root||t?.state?.root;if(s?.lang)return s.lang},At=(e,t)=>{const r=(e?.state?.root||t?.state?.root)?.__fetchScope;return r?String(r):void 0},Lt=(e,t,s)=>{let r;if(!e)r=void 0;else if((0,f.isFunction)(e))r=e(t,t.state);else{r={};for(const o in e){const a=e[o];r[o]=(0,f.isFunction)(a)?a(t,t.state):a}}return r},ct=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const s=(r,o)=>{const a=t.state?.root;a?.update&&a.update({auth:{user:r,session:o,loading:!1}})};try{const r=await e.getSession();s(r?.user||null,r)}catch(r){console.warn("[fetch] Failed to restore auth session:",r.message)}e.onAuthStateChange&&e.onAuthStateChange((r,o)=>{s(o?.user||null,o)})},St=async(e,t)=>{if((0,f.isFunction)(e.select))return e.auth!==!1&&await ct(e,t),e;if(e.__resolved)return e.auth!==!1&&await ct(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=kt(e);const s=await e.__resolving;return delete e.__resolving,s?(s.auth=e.auth,s.url=e.url,s.key=e.key,e.__resolved=s,t.fetch=s,e.auth!==!1&&await ct(s,t),s):null},T=(e,t,...s)=>{const r=(0,f.isFunction)(e[t])?e[t]:null;r&&r.call(e,...s,e,e.state,e.context)},C=(e,t,s,...r)=>{const o=e&&(0,f.isFunction)(e[s])?e[s]:null;o&&o.call(t,...r,t,t.state,t.context)},X=e=>{const t={},s=e.node;if(!s)return t;if(s.tagName==="FORM"){const o=new FormData(s);for(const[a,i]of o.entries())t[a]=i;return t}const r=s.querySelectorAll("input, textarea, select");for(let o=0;o<r.length;o++){const a=r[o],i=a.name||a.getAttribute("name");i&&(a.type==="checkbox"?t[i]=a.checked:a.type==="file"?t[i]=a.files:t[i]=a.value)}return t},z=(e,t,s,r={})=>{const o=s&&s.startsWith("~/"),a=o&&e.state?.root||e.state;if(a?.update)if(o){const i=s.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&i in t?a.update(t,{preventFetch:!0,...r}):a.update({[i]:t},{preventFetch:!0,...r})}else{const i=s?{[s]:t}:t;a.update(i,{preventFetch:!0,...r})}},k=(e,t)=>{const s=e?.__ref;s&&(s.__fetchStatus=t,s.__fetching=t.isFetching,s.__fetchError=t.error)},I=async(e,t,s,r={})=>{const o=s?.fetch;if(!o||!t||!t.__ref||e.enabled===!1||(0,f.isFunction)(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||(0,f.isFunction)(e.skip)&&e.skip(t,t.state))return;const a=await St(o,s);if(!a||!t.__ref)return;const i=t.__ref,{from:c,method:n,query:_,params:m,cache:Z,transform:F,single:ut,auth:tt,fields:R,as:O,limit:K,offset:et,order:j,headers:N,baseUrl:y,page:g,cursor:v,getNextPageParam:G,getPreviousPageParam:S,infinite:P,placeholderData:q,initialData:Q,select:A,keepPreviousData:$}=e;let E=(0,f.isString)(A)?A:void 0;if(_&&(0,f.isFunction)(t.getQuery)){const d=t.getQuery(a.name||"paths");d&&(E=d.select||d.length&&d.join(",")||E)}const L=Lt(m,t,s),D=yt(Z),st=Et(e),lt=ft(t,s),mt=At(t,s),$t=lt?`:${lt}`:"",Mt=mt?`${mt}:`:"",p=D?Z?.key||`${c}:${n}:${Mt}${JSON.stringify(L||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${$t}`:null;if(!i.__fetchInitialized&&p&&(i.__fetchInitialized=!0,Q!==void 0)){const d=(0,f.isFunction)(Q)?Q():Q;H(p,d,null)}if((n==="select"||n==="rpc")&&p&&D){const d=J(p);if(d&&!d.error){const l=Date.now()-d.time,h=d.stale||l>(D.staleTime||0);let u=d.data;if((0,f.isFunction)(A)&&(u=A(u,t,t.state)),F&&(u=F(u,t,t.state)),z(t,u,O),!h){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(q!==void 0){const l=(0,f.isFunction)(q)?q(t,t.state):q;l!==void 0&&z(t,l,O)}}if(p&&B.has(p)&&!r.force){const d=B.get(p);try{const l=await Promise.race([d,new Promise((h,u)=>setTimeout(()=>u("DEDUP_TIMEOUT"),15e3))]);if(l?.data!==void 0){let h=l.data;(0,f.isFunction)(A)&&(h=A(h,t,t.state)),F&&(h=F(h,t,t.state)),z(t,h,O),T(t,"onFetchComplete",h),C(e,t,"onFetchComplete",h)}}catch{}return}const Rt=!J(p)?.data;k(t,{isFetching:!0,isLoading:Rt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),T(t,"onFetchStart"),C(e,t,"onFetchStart");const M=s?.analyze?.emitNetwork,dt=M?typeof performance<"u"?performance.now():Date.now():0;M&&M({phase:"start",mode:"query",from:c,method:n,cacheKey:p,lang:lt});const vt=Dt(async()=>{if(tt!==!1&&a.auth!==!1&&a.getSession){const u=await a.getSession();if(tt===!0&&!u){const b={message:"Not authenticated"};return k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:b,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",b),C(e,t,"onFetchError",b),{data:null,error:b}}}const d=a[n];if(!(0,f.isFunction)(d))return{data:null,error:{message:`Method "${n}" not found on adapter`}};const l={from:c,select:E,params:L,single:ut,limit:K,offset:et,order:j,headers:N,baseUrl:y},h=ft(t,s);if(h&&(l.headers={...l.headers,"Accept-Language":h}),g!==void 0){if((0,f.isObject)(g))g.offset!==void 0&&(l.offset=g.offset),g.limit!==void 0&&(l.limit=g.limit),g.cursor!==void 0&&(l.params={...l.params,cursor:g.cursor});else if(typeof g=="number"){const u=e.pageSize||K||20;l.offset=(g-1)*u,l.limit=u}}if(v!==void 0&&(l.params={...l.params,cursor:v}),n==="insert"||n==="update"||n==="upsert"){let u;if(R===!0||e.on==="submit")u=X(t);else if((0,f.isArray)(R)){const b=X(t);u={};for(const ht of R)u[ht]=b[ht]}else t.state?.parse?u=t.state.parse():(0,f.isObject)(t.state)&&(u={...t.state});F&&(u=F(u,t,t.state)),l.data=u}if(n==="rpc"){let u=L;if(e.on==="submit"){const b=X(t);u=e.transformParams?e.transformParams(b,t,t.state):b}l.params=u}if(n==="subscribe"){const u=a.subscribe({from:c,params:L,on:e.subscribeOn},(b,ht,ne)=>{z(t,b,O),T(t,"onFetchComplete",b),C(e,t,"onFetchComplete",b)});return i.__unsubscribe=u,{data:null,error:null,subscribed:!0}}return d(l)},st);p&&B.set(p,vt);try{const d=await vt;if(d?.subscribed)return;const{data:l,error:h}=d||{};if(h){p&&H(p,null,h),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",h),C(e,t,"onFetchError",h),M&&M({phase:"error",mode:"query",from:c,method:n,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-dt});return}if(l!==void 0){if((n==="select"||n==="rpc")&&p){const b=H(p,l,null);b.gcTime=D?.gcTime||3e5}let u=l;P&&(0,f.isArray)(l)&&(i.__pages||(i.__pages=[]),r.direction==="previous"?i.__pages.unshift(l):i.__pages.push(l),u=i.__pages.flat(),G&&(i.__nextPageParam=G(l,i.__pages),i.__hasNextPage=i.__nextPageParam!=null),S&&(i.__prevPageParam=S(l,i.__pages),i.__hasPreviousPage=i.__prevPageParam!=null)),(0,f.isFunction)(A)&&(u=A(u,t,t.state)),F&&(u=F(u,t,t.state)),(!$||u!==void 0)&&z(t,u,O),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),T(t,"onFetchComplete",u),C(e,t,"onFetchComplete",u),M&&M({phase:"success",mode:"query",ok:!0,from:c,method:n,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-dt})}}catch(d){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",d),C(e,t,"onFetchError",d),M&&M({phase:"error",mode:"query",from:c,method:n,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-dt})}finally{p&&B.delete(p)}},Xt=(e,t,s)=>{const r=e.on,o=t.__ref;o.__fetchListeners||(o.__fetchListeners=[]);const a=e.__runner||I;if(r==="submit"){const i=n=>{n.preventDefault(),a(e,t,s)},c=t.node;c&&(c.addEventListener("submit",i),o.__fetchListeners.push(()=>c.removeEventListener("submit",i)))}else if(r==="click"){const i=()=>a(e,t,s),c=t.node;c&&(c.addEventListener("click",i),o.__fetchListeners.push(()=>c.removeEventListener("click",i)))}else r==="stateChange"&&(o.__fetchOnStateChange=()=>a(e,t,s))},Zt=(e,t,s)=>{const r=t.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),Ht();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:W(o);if(a>0){const i=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&I(e,t,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(i))}}if(e.refetchOnWindowFocus!==!1){const a=()=>{const i=ft(t,s),c=At(t,s),n=Bt(e,i,c),_=J(n),m=yt(e.cache);(!_||_.stale||Date.now()-_.time>(m?.staleTime||0))&&I(e,t,s,{force:!0})};x.focus.add(a),r.__fetchCleanups.push(()=>x.focus.delete(a))}if(e.refetchOnReconnect!==!1){const a=()=>I(e,t,s,{force:!0});x.online.add(a),r.__fetchCleanups.push(()=>x.online.delete(a))}},te=(e,t,s)=>{if(!t.optimistic)return null;const r=e.__ref,o=t.as,a=e.state?.parse?e.state.parse():(0,f.isObject)(e.state)?{...e.state}:e.state;r.__optimisticSnapshot=a;const i=(0,f.isFunction)(t.optimistic)?t.optimistic(s,a,e):t.optimistic;return i!==void 0&&z(e,i,o),a},bt=(e,t)=>{const s=e.__ref,r=s.__optimisticSnapshot;r!==void 0&&(z(e,r,t.as),delete s.__optimisticSnapshot)},ee=async(e,t,s)=>{const r=s?.fetch;if(!r)return;const o=await St(r,s);if(!o)return;const a=t.__ref,{method:i,from:c,fields:n,transform:_,as:m,on:Z,auth:F,headers:ut,baseUrl:tt,invalidates:R,optimistic:O,onMutate:K,onSuccess:et,onError:j,onSettled:N}=e;let y;if(n===!0||Z==="submit")y=X(t);else if((0,f.isArray)(n)){const S=X(t);y={};for(const P of n)y[P]=S[P]}else t.state?.parse?y=t.state.parse():(0,f.isObject)(t.state)&&(y={...t.state});_&&(y=_(y,t,t.state)),(0,f.isFunction)(K)&&K(y,t,t.state);const g=O?te(t,e,y):null;a.__fetching=!0,k(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),T(t,"onFetchStart"),C(e,t,"onFetchStart");const v=s?.analyze?.emitNetwork,G=v?typeof performance<"u"?performance.now():Date.now():0;v&&v({phase:"start",mode:"mutation",from:c,method:i});try{if(F!==!1&&o.auth!==!1&&o.getSession){const L=await o.getSession();if(F===!0&&!L){g!==void 0&&bt(t,e);const D={message:"Not authenticated"};T(t,"onFetchError",D),C(e,t,"onFetchError",D);return}}const S=o[i];if(!(0,f.isFunction)(S))return;const P={from:c,data:y,headers:ut,baseUrl:tt};e.params&&(P.params=Lt(e.params,t,s));const q=ft(t,s);q&&(P.headers={...P.headers,"Accept-Language":q});const Q=Et(e),A=await Dt(()=>S(P),Q),{data:$,error:E}=A||{};if(E){g!==void 0&&bt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:E,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",E),(0,f.isFunction)(j)&&j(E,y,t),(0,f.isFunction)(N)&&N(null,E,y,t),v&&v({phase:"error",mode:"mutation",from:c,method:i,error:E.message||String(E),durationMs:(typeof performance<"u"?performance.now():Date.now())-G});return}if(delete a.__optimisticSnapshot,$!==void 0){const L=m?{[m]:$}:$;t.state?.update&&t.state.update(L,{preventFetch:!0})}if(k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),T(t,"onFetchComplete",$),C(e,t,"onFetchComplete",$),(0,f.isFunction)(et)&&et($,y,t),(0,f.isFunction)(N)&&N($,null,y,t),v&&v({phase:"success",mode:"mutation",ok:!0,from:c,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-G}),R){const L=(0,f.isArray)(R)?R:[R];for(const D of L)if(D===!0||D==="*")for(const[st]of w)st.startsWith(c+":")&&V(st);else V(D)}}catch(S){g!==void 0&&bt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",S),C(e,t,"onFetchError",S),(0,f.isFunction)(j)&&j(S,y,t),(0,f.isFunction)(N)&&N(null,S,y,t),v&&v({phase:"error",mode:"mutation",from:c,method:i,error:S.message||String(S),durationMs:(typeof performance<"u"?performance.now():Date.now())-G})}finally{a.__fetching=!1}},wt=(e,t,s,r)=>{if(!e||!r?.fetch)return;const a=(0,f.exec)(e,t);if(!a)return;const i=(0,f.isArray)(a)?a.map(n=>Pt((0,f.exec)(n,t),t)).filter(Boolean):[Pt(a,t)].filter(Boolean);for(const n of i){const _=n.method==="insert"||n.method==="update"||n.method==="upsert"||n.method==="delete",m=_?ee:I;n.on==="create"?m(n,t,r):Promise.resolve().then(()=>{Xt({...n,__runner:m},t,r)}),!_&&n.on==="create"&&(n.refetchInterval||n.refetchOnWindowFocus!==!1||n.refetchOnReconnect!==!1)&&Zt(n,t,r)}const c=t.__ref;c.refetch=n=>{for(const _ of i)I(_,t,r,{force:!0,...n})},c.fetchNextPage=()=>{const n=i[0];if(!n||!n.infinite)return;const _=c.__nextPageParam;if(_==null)return;const m={...n,cursor:_};I(m,t,r,{direction:"next",force:!0})},c.fetchPreviousPage=()=>{const n=i[0];if(!n||!n.infinite)return;const _=c.__prevPageParam;if(_==null)return;const m={...n,cursor:_};I(m,t,r,{direction:"previous",force:!0})}},se={invalidateQueries:e=>{if(!e){V();return}if((0,f.isString)(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&V(t);else if((0,f.isArray)(e)){const t=e.join(":");for(const[s]of w)s.includes(t)&&V(s)}},removeQueries:e=>{if(!e){it();return}if((0,f.isString)(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&it(t)},getQueryData:e=>J(e)?.data??void 0,setQueryData:(e,t)=>{const s=J(e),r=(0,f.isFunction)(t)?t(s?.data):t;H(e,r,null)},prefetchQuery:async(e,t)=>{const s=t?.fetch;if(!s)return;const r=await St(s,t);if(!r)return;const o=e.cache?.key||`${e.from}:${e.method||"select"}:${JSON.stringify(e.params||"")}`,a=r[e.method||"select"];if(!(0,f.isFunction)(a))return;const i=await a({from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single});if(i?.data!==void 0&&!i?.error){const c=H(o,i.data,null);c.gcTime=yt(e.cache)?.gcTime||3e5}return i},getCache:()=>w,clear:()=>it(),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[s]of w)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(t)||it(s))}},re={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||B.clear(),wt(t,e,e.state,e.context))}};var ae=wt;
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isArray as Q,isFunction as l,isObject as Y,isString as B,exec as vt}from"@symbo.ls/utils";const Mt=["select","rpc","insert","update","delete","subscribe"],Rt={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},ot=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),J=(()=>{if(typeof globalThis<"u"&&globalThis[ot])return globalThis[ot];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ot,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ot]}catch{}return e})(),nt=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),_t=(()=>{if(typeof globalThis<"u"&&globalThis[nt])return globalThis[nt];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,nt,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[nt]}catch{}return e})(),Nt=5e3,It=e=>new Promise(t=>{if(J[e])return t(J[e]);const s=_t[e]||=[];let r=!1;const o=()=>{r||(r=!0,t(J[e]||null))};s.push(o),setTimeout(o,Nt)}),Bt=(e,t)=>{J[e]=t;const s=_t[e];if(s&&s.length){_t[e]=[];for(const r of s)r()}},Jt=e=>{const t={};for(const s of Mt)e[s]&&(t[s]=e[s]);return t.name=e.name||"custom",t},$t=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...s}=e,r=typeof t=="string"?t:typeof e=="string"?e:null;if(!r)return null;let o=J[r]||Rt[r];if(!o&&(o=await It(r),!o))throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await o();if(!a||typeof a.setup!="function")throw new Error(`Adapter "${r}" loader returned a module without a setup() function. Got keys: [${Object.keys(a||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return a.setup(s)},H=e=>{if(!e)return 0;if(typeof e=="number")return e;const t=e.match(/^(\d+)(ms|s|m|h)$/);if(!t)return 0;const s=parseInt(t[1]),r=t[2];return r==="ms"?s:r==="s"?s*1e3:r==="m"?s*6e4:r==="h"?s*36e5:0},w=new Map,U=new Map,V=new Map,Ot=(e,t)=>{if(e.cache?.key)return e.cache.key;const s=zt(e.params),r=`${e.from}:${e.method}:${JSON.stringify(s||"")}`;return t?`${r}:${t}`:r},X=e=>w.get(e)||null,Z=(e,t,s)=>{const r=w.get(e),o={data:t,error:s,time:Date.now(),stale:!1};w.set(e,o);const a=U.get(e);if(a)for(const i of a)l(i)&&i(o);return o},tt=e=>{if(e){const t=w.get(e);t&&(t.stale=!0);return}for(const[,t]of w)t.stale=!0},ft=e=>{if(e){w.delete(e);return}w.clear()},Ht=(e,t)=>(U.has(e)||U.set(e,new Set),U.get(e).add(t),()=>{const s=U.get(e);s&&(s.delete(t),s.size===0&&U.delete(e))}),yt=e=>!e&&e!==!1?{staleTime:6e4,gcTime:3e5}:e===!1?null:e===!0?{staleTime:6e4,gcTime:3e5}:typeof e=="number"?{staleTime:e,gcTime:Math.max(e*5,3e5)}:B(e)?{staleTime:H(e),gcTime:3e5}:{staleTime:H(e.stale||e.staleTime)||6e4,gcTime:H(e.gc||e.gcTime||e.expire)||3e5,key:e.key};let ct=null;const qt=()=>{ct||(ct=setInterval(()=>{const e=Date.now();for(const[t,s]of w){const r=U.get(t);!(r&&r.size>0)&&e-s.time>(s.gcTime||3e5)&&w.delete(t)}},3e4),ct.unref&&ct.unref())};qt();const Tt=3,gt=e=>Math.min(1e3*2**e,3e4),Ft=e=>{const t=e.retry;return t===!1?{count:0}:t===!0||t===void 0?{count:Tt,delay:gt}:typeof t=="number"?{count:t,delay:gt}:{count:t.count??Tt,delay:l(t.delay)?t.delay:typeof t.delay=="number"?()=>t.delay:gt}},Et=async(e,t)=>{const{count:s,delay:r}=t;let o;for(let a=0;a<=s;a++)try{const i=await e();if(i?.error){if(o=i.error,a<s){const f=l(r)?r(a,o):r;await new Promise(n=>setTimeout(n,f));continue}return i}return i}catch(i){if(o=i,a<s){const f=l(r)?r(a,i):r;await new Promise(n=>setTimeout(n,f));continue}throw i}return{data:null,error:o}},W={focus:new Set,online:new Set};let Dt=!1;const Ut=()=>{if(Dt||typeof window>"u")return;Dt=!0;const e=()=>{for(const s of W.focus)s()},t=()=>{for(const s of W.online)s()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},Ct=(e,t)=>{const s=t.__ref;if(e===!0)return{from:s.__state||t.key,method:"select",query:!0,on:"create"};if(B(e))return{from:e,method:"select",query:!0,on:"create"};if(Y(e)){const r={...e};return r.from=r.from||s.__state||t.key,r.method=r.method||"select",r.on=r.on||"create",r.query===void 0&&(r.query=!0),r}return null},zt=e=>(!e||l(e),e),ut=(e,t)=>{const s=e?.state?.root||t?.state?.root;if(s?.lang)return s.lang},Pt=(e,t,s)=>{let r;if(!e)r=void 0;else if(l(e))r=e(t,t.state);else{r={};for(const o in e){const a=e[o];r[o]=l(a)?a(t,t.state):a}}return r},St=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const s=(r,o)=>{const a=t.state?.root;a?.update&&a.update({auth:{user:r,session:o,loading:!1}})};try{const r=await e.getSession();s(r?.user||null,r)}catch(r){console.warn("[fetch] Failed to restore auth session:",r.message)}e.onAuthStateChange&&e.onAuthStateChange((r,o)=>{s(o?.user||null,o)})},bt=async(e,t)=>{if(l(e.select))return e.auth!==!1&&await St(e,t),e;if(e.__resolved)return e.auth!==!1&&await St(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=$t(e);const s=await e.__resolving;return delete e.__resolving,s?(s.auth=e.auth,s.url=e.url,s.key=e.key,e.__resolved=s,t.fetch=s,e.auth!==!1&&await St(s,t),s):null},v=(e,t,...s)=>{const r=l(e[t])?e[t]:null;r&&r.call(e,...s,e,e.state,e.context)},C=(e,t,s,...r)=>{const o=e&&l(e[s])?e[s]:null;o&&o.call(t,...r,t,t.state,t.context)},et=e=>{const t={},s=e.node;if(!s)return t;if(s.tagName==="FORM"){const o=new FormData(s);for(const[a,i]of o.entries())t[a]=i;return t}const r=s.querySelectorAll("input, textarea, select");for(let o=0;o<r.length;o++){const a=r[o],i=a.name||a.getAttribute("name");i&&(a.type==="checkbox"?t[i]=a.checked:a.type==="file"?t[i]=a.files:t[i]=a.value)}return t},z=(e,t,s,r={})=>{const o=s&&s.startsWith("~/"),a=o&&e.state?.root||e.state;if(a?.update)if(o){const i=s.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&i in t?a.update(t,{preventFetch:!0,...r}):a.update({[i]:t},{preventFetch:!0,...r})}else{const i=s?{[s]:t}:t;a.update(i,{preventFetch:!0,...r})}},k=(e,t)=>{const s=e?.__ref;s&&(s.__fetchStatus=t,s.__fetching=t.isFetching,s.__fetchError=t.error)},$=async(e,t,s,r={})=>{const o=s?.fetch;if(!o||!t||!t.__ref||e.enabled===!1||l(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||l(e.skip)&&e.skip(t,t.state))return;const a=await bt(o,s);if(!a||!t.__ref)return;const i=t.__ref,{from:f,method:n,query:y,params:T,cache:st,transform:F,single:lt,auth:rt,fields:N,as:O,limit:K,offset:at,order:x,headers:I,baseUrl:_,page:g,cursor:m,getNextPageParam:j,getPreviousPageParam:S,infinite:P,placeholderData:q,initialData:G,select:A,keepPreviousData:M}=e;let E=B(A)?A:void 0;if(y&&l(t.getQuery)){const d=t.getQuery(a.name||"paths");d&&(E=d.select||d.length&&d.join(",")||E)}const L=Pt(T,t,s),D=yt(st),it=Ft(e),dt=ut(t,s),Lt=dt?`:${dt}`:"",p=D?st?.key||`${f}:${n}:${JSON.stringify(L||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${Lt}`:null;if(!i.__fetchInitialized&&p&&(i.__fetchInitialized=!0,G!==void 0)){const d=l(G)?G():G;Z(p,d,null)}if((n==="select"||n==="rpc")&&p&&D){const d=X(p);if(d&&!d.error){const u=Date.now()-d.time,h=d.stale||u>(D.staleTime||0);let c=d.data;if(l(A)&&(c=A(c,t,t.state)),F&&(c=F(c,t,t.state)),z(t,c,O),!h){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(q!==void 0){const u=l(q)?q(t,t.state):q;u!==void 0&&z(t,u,O)}}if(p&&V.has(p)&&!r.force){const d=V.get(p);try{const u=await Promise.race([d,new Promise((h,c)=>setTimeout(()=>c("DEDUP_TIMEOUT"),15e3))]);if(u?.data!==void 0){let h=u.data;l(A)&&(h=A(h,t,t.state)),F&&(h=F(h,t,t.state)),z(t,h,O),v(t,"onFetchComplete",h),C(e,t,"onFetchComplete",h)}}catch{}return}const kt=!X(p)?.data;k(t,{isFetching:!0,isLoading:kt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(t,"onFetchStart"),C(e,t,"onFetchStart");const R=s?.analyze?.emitNetwork,ht=R?typeof performance<"u"?performance.now():Date.now():0;R&&R({phase:"start",mode:"query",from:f,method:n,cacheKey:p,lang:dt});const mt=Et(async()=>{if(rt!==!1&&a.auth!==!1&&a.getSession){const c=await a.getSession();if(rt===!0&&!c){const b={message:"Not authenticated"};return k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:b,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",b),C(e,t,"onFetchError",b),{data:null,error:b}}}const d=a[n];if(!l(d))return{data:null,error:{message:`Method "${n}" not found on adapter`}};const u={from:f,select:E,params:L,single:lt,limit:K,offset:at,order:x,headers:I,baseUrl:_},h=ut(t,s);if(h&&(u.headers={...u.headers,"Accept-Language":h}),g!==void 0){if(Y(g))g.offset!==void 0&&(u.offset=g.offset),g.limit!==void 0&&(u.limit=g.limit),g.cursor!==void 0&&(u.params={...u.params,cursor:g.cursor});else if(typeof g=="number"){const c=e.pageSize||K||20;u.offset=(g-1)*c,u.limit=c}}if(m!==void 0&&(u.params={...u.params,cursor:m}),n==="insert"||n==="update"||n==="upsert"){let c;if(N===!0||e.on==="submit")c=et(t);else if(Q(N)){const b=et(t);c={};for(const pt of N)c[pt]=b[pt]}else t.state?.parse?c=t.state.parse():Y(t.state)&&(c={...t.state});F&&(c=F(c,t,t.state)),u.data=c}if(n==="rpc"){let c=L;if(e.on==="submit"){const b=et(t);c=e.transformParams?e.transformParams(b,t,t.state):b}u.params=c}if(n==="subscribe"){const c=a.subscribe({from:f,params:L,on:e.subscribeOn},(b,pt,Kt)=>{z(t,b,O),v(t,"onFetchComplete",b),C(e,t,"onFetchComplete",b)});return i.__unsubscribe=c,{data:null,error:null,subscribed:!0}}return d(u)},it);p&&V.set(p,mt);try{const d=await mt;if(d?.subscribed)return;const{data:u,error:h}=d||{};if(h){p&&Z(p,null,h),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",h),C(e,t,"onFetchError",h),R&&R({phase:"error",mode:"query",from:f,method:n,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-ht});return}if(u!==void 0){if((n==="select"||n==="rpc")&&p){const b=Z(p,u,null);b.gcTime=D?.gcTime||3e5}let c=u;P&&Q(u)&&(i.__pages||(i.__pages=[]),r.direction==="previous"?i.__pages.unshift(u):i.__pages.push(u),c=i.__pages.flat(),j&&(i.__nextPageParam=j(u,i.__pages),i.__hasNextPage=i.__nextPageParam!=null),S&&(i.__prevPageParam=S(u,i.__pages),i.__hasPreviousPage=i.__prevPageParam!=null)),l(A)&&(c=A(c,t,t.state)),F&&(c=F(c,t,t.state)),(!M||c!==void 0)&&z(t,c,O),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",c),C(e,t,"onFetchComplete",c),R&&R({phase:"success",mode:"query",ok:!0,from:f,method:n,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-ht})}}catch(d){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",d),C(e,t,"onFetchError",d),R&&R({phase:"error",mode:"query",from:f,method:n,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-ht})}finally{p&&V.delete(p)}},xt=(e,t,s)=>{const r=e.on,o=t.__ref;o.__fetchListeners||(o.__fetchListeners=[]);const a=e.__runner||$;if(r==="submit"){const i=n=>{n.preventDefault(),a(e,t,s)},f=t.node;f&&(f.addEventListener("submit",i),o.__fetchListeners.push(()=>f.removeEventListener("submit",i)))}else if(r==="click"){const i=()=>a(e,t,s),f=t.node;f&&(f.addEventListener("click",i),o.__fetchListeners.push(()=>f.removeEventListener("click",i)))}else r==="stateChange"&&(o.__fetchOnStateChange=()=>a(e,t,s))},jt=(e,t,s)=>{const r=t.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),Ut();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:H(o);if(a>0){const i=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&$(e,t,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(i))}}if(e.refetchOnWindowFocus!==!1){const a=()=>{const i=ut(t,s),f=Ot(e,i),n=X(f),y=yt(e.cache);(!n||n.stale||Date.now()-n.time>(y?.staleTime||0))&&$(e,t,s,{force:!0})};W.focus.add(a),r.__fetchCleanups.push(()=>W.focus.delete(a))}if(e.refetchOnReconnect!==!1){const a=()=>$(e,t,s,{force:!0});W.online.add(a),r.__fetchCleanups.push(()=>W.online.delete(a))}},Gt=(e,t,s)=>{if(!t.optimistic)return null;const r=e.__ref,o=t.as,a=e.state?.parse?e.state.parse():Y(e.state)?{...e.state}:e.state;r.__optimisticSnapshot=a;const i=l(t.optimistic)?t.optimistic(s,a,e):t.optimistic;return i!==void 0&&z(e,i,o),a},wt=(e,t)=>{const s=e.__ref,r=s.__optimisticSnapshot;r!==void 0&&(z(e,r,t.as),delete s.__optimisticSnapshot)},Qt=async(e,t,s)=>{const r=s?.fetch;if(!r)return;const o=await bt(r,s);if(!o)return;const a=t.__ref,{method:i,from:f,fields:n,transform:y,as:T,on:st,auth:F,headers:lt,baseUrl:rt,invalidates:N,optimistic:O,onMutate:K,onSuccess:at,onError:x,onSettled:I}=e;let _;if(n===!0||st==="submit")_=et(t);else if(Q(n)){const S=et(t);_={};for(const P of n)_[P]=S[P]}else t.state?.parse?_=t.state.parse():Y(t.state)&&(_={...t.state});y&&(_=y(_,t,t.state)),l(K)&&K(_,t,t.state);const g=O?Gt(t,e,_):null;a.__fetching=!0,k(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(t,"onFetchStart"),C(e,t,"onFetchStart");const m=s?.analyze?.emitNetwork,j=m?typeof performance<"u"?performance.now():Date.now():0;m&&m({phase:"start",mode:"mutation",from:f,method:i});try{if(F!==!1&&o.auth!==!1&&o.getSession){const L=await o.getSession();if(F===!0&&!L){g!==void 0&&wt(t,e);const D={message:"Not authenticated"};v(t,"onFetchError",D),C(e,t,"onFetchError",D);return}}const S=o[i];if(!l(S))return;const P={from:f,data:_,headers:lt,baseUrl:rt};e.params&&(P.params=Pt(e.params,t,s));const q=ut(t,s);q&&(P.headers={...P.headers,"Accept-Language":q});const G=Ft(e),A=await Et(()=>S(P),G),{data:M,error:E}=A||{};if(E){g!==void 0&&wt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:E,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",E),l(x)&&x(E,_,t),l(I)&&I(null,E,_,t),m&&m({phase:"error",mode:"mutation",from:f,method:i,error:E.message||String(E),durationMs:(typeof performance<"u"?performance.now():Date.now())-j});return}if(delete a.__optimisticSnapshot,M!==void 0){const L=T?{[T]:M}:M;t.state?.update&&t.state.update(L,{preventFetch:!0})}if(k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",M),C(e,t,"onFetchComplete",M),l(at)&&at(M,_,t),l(I)&&I(M,null,_,t),m&&m({phase:"success",mode:"mutation",ok:!0,from:f,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-j}),N){const L=Q(N)?N:[N];for(const D of L)if(D===!0||D==="*")for(const[it]of w)it.startsWith(f+":")&&tt(it);else tt(D)}}catch(S){g!==void 0&&wt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",S),C(e,t,"onFetchError",S),l(x)&&x(S,_,t),l(I)&&I(null,S,_,t),m&&m({phase:"error",mode:"mutation",from:f,method:i,error:S.message||String(S),durationMs:(typeof performance<"u"?performance.now():Date.now())-j})}finally{a.__fetching=!1}},At=(e,t,s,r)=>{if(!e||!r?.fetch)return;const a=vt(e,t);if(!a)return;const i=Q(a)?a.map(n=>Ct(vt(n,t),t)).filter(Boolean):[Ct(a,t)].filter(Boolean);for(const n of i){const y=n.method==="insert"||n.method==="update"||n.method==="upsert"||n.method==="delete",T=y?Qt:$;n.on==="create"?T(n,t,r):Promise.resolve().then(()=>{xt({...n,__runner:T},t,r)}),!y&&n.on==="create"&&(n.refetchInterval||n.refetchOnWindowFocus!==!1||n.refetchOnReconnect!==!1)&&jt(n,t,r)}const f=t.__ref;f.refetch=n=>{for(const y of i)$(y,t,r,{force:!0,...n})},f.fetchNextPage=()=>{const n=i[0];if(!n||!n.infinite)return;const y=f.__nextPageParam;if(y==null)return;const T={...n,cursor:y};$(T,t,r,{direction:"next",force:!0})},f.fetchPreviousPage=()=>{const n=i[0];if(!n||!n.infinite)return;const y=f.__prevPageParam;if(y==null)return;const T={...n,cursor:y};$(T,t,r,{direction:"previous",force:!0})}},Vt={invalidateQueries:e=>{if(!e){tt();return}if(B(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&tt(t);else if(Q(e)){const t=e.join(":");for(const[s]of w)s.includes(t)&&tt(s)}},removeQueries:e=>{if(!e){ft();return}if(B(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&ft(t)},getQueryData:e=>X(e)?.data??void 0,setQueryData:(e,t)=>{const s=X(e),r=l(t)?t(s?.data):t;Z(e,r,null)},prefetchQuery:async(e,t)=>{const s=t?.fetch;if(!s)return;const r=await bt(s,t);if(!r)return;const o=e.cache?.key||`${e.from}:${e.method||"select"}:${JSON.stringify(e.params||"")}`,a=r[e.method||"select"];if(!l(a))return;const i=await a({from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single});if(i?.data!==void 0&&!i?.error){const f=Z(o,i.data,null);f.gcTime=yt(e.cache)?.gcTime||3e5}return i},getCache:()=>w,clear:()=>ft(),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[s]of w)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(t)||ft(s))}},Xt={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||V.clear(),At(t,e,e.state,e.context))}};var Zt=At;export{Jt as createAdapter,Zt as default,At as executeFetch,Xt as fetchPlugin,St as initAdapterAuth,H as parseDuration,Vt as queryClient,Bt as registerAdapter,$t as resolveDb};
|
|
1
|
+
import{isArray as x,isFunction as l,isObject as Y,isString as B,exec as Tt}from"@symbo.ls/utils";const Nt=["select","rpc","insert","update","delete","subscribe"],It={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},it=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),J=(()=>{if(typeof globalThis<"u"&&globalThis[it])return globalThis[it];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,it,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[it]}catch{}return e})(),nt=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),_t=(()=>{if(typeof globalThis<"u"&&globalThis[nt])return globalThis[nt];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,nt,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[nt]}catch{}return e})(),Ot=5e3,qt=e=>new Promise(t=>{if(J[e])return t(J[e]);const s=_t[e]||=[];let r=!1;const i=()=>{r||(r=!0,t(J[e]||null))};s.push(i),setTimeout(i,Ot)}),Vt=(e,t)=>{J[e]=t;const s=_t[e];if(s&&s.length){_t[e]=[];for(const r of s)r()}},Xt=e=>{const t={};for(const s of Nt)e[s]&&(t[s]=e[s]);return t.name=e.name||"custom",t},Ut=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...s}=e,r=typeof t=="string"?t:typeof e=="string"?e:null;if(!r)return null;let i=J[r]||It[r];if(!i&&(i=await qt(r),!i))throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await i();if(!a||typeof a.setup!="function")throw new Error(`Adapter "${r}" loader returned a module without a setup() function. Got keys: [${Object.keys(a||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return a.setup(s)},H=e=>{if(!e)return 0;if(typeof e=="number")return e;const t=e.match(/^(\d+)(ms|s|m|h)$/);if(!t)return 0;const s=parseInt(t[1]),r=t[2];return r==="ms"?s:r==="s"?s*1e3:r==="m"?s*6e4:r==="h"?s*36e5:0},w=new Map,U=new Map,V=new Map,zt=(e,t,s)=>{if(e.cache?.key)return e.cache.key;const r=Qt(e.params),i=s?`${s}:`:"",a=`${e.from}:${e.method}:${i}${JSON.stringify(r||"")}`;return t?`${a}:${t}`:a},X=e=>w.get(e)||null,Z=(e,t,s)=>{const r=w.get(e),i={data:t,error:s,time:Date.now(),stale:!1};w.set(e,i);const a=U.get(e);if(a)for(const o of a)l(o)&&o(i);return i},tt=e=>{if(e){const t=w.get(e);t&&(t.stale=!0);return}for(const[,t]of w)t.stale=!0},ft=e=>{if(e){w.delete(e);return}w.clear()},Zt=(e,t)=>(U.has(e)||U.set(e,new Set),U.get(e).add(t),()=>{const s=U.get(e);s&&(s.delete(t),s.size===0&&U.delete(e))}),yt=e=>!e&&e!==!1?{staleTime:6e4,gcTime:3e5}:e===!1?null:e===!0?{staleTime:6e4,gcTime:3e5}:typeof e=="number"?{staleTime:e,gcTime:Math.max(e*5,3e5)}:B(e)?{staleTime:H(e),gcTime:3e5}:{staleTime:H(e.stale||e.staleTime)||6e4,gcTime:H(e.gc||e.gcTime||e.expire)||3e5,key:e.key};let ct=null;const jt=()=>{ct||(ct=setInterval(()=>{const e=Date.now();for(const[t,s]of w){const r=U.get(t);!(r&&r.size>0)&&e-s.time>(s.gcTime||3e5)&&w.delete(t)}},3e4),ct.unref&&ct.unref())};jt();const Ft=3,gt=e=>Math.min(1e3*2**e,3e4),Et=e=>{const t=e.retry;return t===!1?{count:0}:t===!0||t===void 0?{count:Ft,delay:gt}:typeof t=="number"?{count:t,delay:gt}:{count:t.count??Ft,delay:l(t.delay)?t.delay:typeof t.delay=="number"?()=>t.delay:gt}},Dt=async(e,t)=>{const{count:s,delay:r}=t;let i;for(let a=0;a<=s;a++)try{const o=await e();if(o?.error){if(i=o.error,a<s){const f=l(r)?r(a,i):r;await new Promise(n=>setTimeout(n,f));continue}return o}return o}catch(o){if(i=o,a<s){const f=l(r)?r(a,o):r;await new Promise(n=>setTimeout(n,f));continue}throw o}return{data:null,error:i}},W={focus:new Set,online:new Set};let Ct=!1;const Gt=()=>{if(Ct||typeof window>"u")return;Ct=!0;const e=()=>{for(const s of W.focus)s()},t=()=>{for(const s of W.online)s()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},Pt=(e,t)=>{const s=t.__ref;if(e===!0)return{from:s.__state||t.key,method:"select",query:!0,on:"create"};if(B(e))return{from:e,method:"select",query:!0,on:"create"};if(Y(e)){const r={...e};return r.from=r.from||s.__state||t.key,r.method=r.method||"select",r.on=r.on||"create",r.query===void 0&&(r.query=!0),r}return null},Qt=e=>(!e||l(e),e),ut=(e,t)=>{const s=e?.state?.root||t?.state?.root;if(s?.lang)return s.lang},At=(e,t)=>{const r=(e?.state?.root||t?.state?.root)?.__fetchScope;return r?String(r):void 0},Lt=(e,t,s)=>{let r;if(!e)r=void 0;else if(l(e))r=e(t,t.state);else{r={};for(const i in e){const a=e[i];r[i]=l(a)?a(t,t.state):a}}return r},St=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const s=(r,i)=>{const a=t.state?.root;a?.update&&a.update({auth:{user:r,session:i,loading:!1}})};try{const r=await e.getSession();s(r?.user||null,r)}catch(r){console.warn("[fetch] Failed to restore auth session:",r.message)}e.onAuthStateChange&&e.onAuthStateChange((r,i)=>{s(i?.user||null,i)})},bt=async(e,t)=>{if(l(e.select))return e.auth!==!1&&await St(e,t),e;if(e.__resolved)return e.auth!==!1&&await St(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=Ut(e);const s=await e.__resolving;return delete e.__resolving,s?(s.auth=e.auth,s.url=e.url,s.key=e.key,e.__resolved=s,t.fetch=s,e.auth!==!1&&await St(s,t),s):null},T=(e,t,...s)=>{const r=l(e[t])?e[t]:null;r&&r.call(e,...s,e,e.state,e.context)},C=(e,t,s,...r)=>{const i=e&&l(e[s])?e[s]:null;i&&i.call(t,...r,t,t.state,t.context)},et=e=>{const t={},s=e.node;if(!s)return t;if(s.tagName==="FORM"){const i=new FormData(s);for(const[a,o]of i.entries())t[a]=o;return t}const r=s.querySelectorAll("input, textarea, select");for(let i=0;i<r.length;i++){const a=r[i],o=a.name||a.getAttribute("name");o&&(a.type==="checkbox"?t[o]=a.checked:a.type==="file"?t[o]=a.files:t[o]=a.value)}return t},z=(e,t,s,r={})=>{const i=s&&s.startsWith("~/"),a=i&&e.state?.root||e.state;if(a?.update)if(i){const o=s.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&o in t?a.update(t,{preventFetch:!0,...r}):a.update({[o]:t},{preventFetch:!0,...r})}else{const o=s?{[s]:t}:t;a.update(o,{preventFetch:!0,...r})}},k=(e,t)=>{const s=e?.__ref;s&&(s.__fetchStatus=t,s.__fetching=t.isFetching,s.__fetchError=t.error)},I=async(e,t,s,r={})=>{const i=s?.fetch;if(!i||!t||!t.__ref||e.enabled===!1||l(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||l(e.skip)&&e.skip(t,t.state))return;const a=await bt(i,s);if(!a||!t.__ref)return;const o=t.__ref,{from:f,method:n,query:_,params:m,cache:st,transform:F,single:lt,auth:rt,fields:R,as:O,limit:K,offset:at,order:j,headers:N,baseUrl:y,page:g,cursor:v,getNextPageParam:G,getPreviousPageParam:S,infinite:P,placeholderData:q,initialData:Q,select:A,keepPreviousData:$}=e;let E=B(A)?A:void 0;if(_&&l(t.getQuery)){const d=t.getQuery(a.name||"paths");d&&(E=d.select||d.length&&d.join(",")||E)}const L=Lt(m,t,s),D=yt(st),ot=Et(e),dt=ut(t,s),mt=At(t,s),$t=dt?`:${dt}`:"",Mt=mt?`${mt}:`:"",p=D?st?.key||`${f}:${n}:${Mt}${JSON.stringify(L||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${$t}`:null;if(!o.__fetchInitialized&&p&&(o.__fetchInitialized=!0,Q!==void 0)){const d=l(Q)?Q():Q;Z(p,d,null)}if((n==="select"||n==="rpc")&&p&&D){const d=X(p);if(d&&!d.error){const u=Date.now()-d.time,h=d.stale||u>(D.staleTime||0);let c=d.data;if(l(A)&&(c=A(c,t,t.state)),F&&(c=F(c,t,t.state)),z(t,c,O),!h){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(q!==void 0){const u=l(q)?q(t,t.state):q;u!==void 0&&z(t,u,O)}}if(p&&V.has(p)&&!r.force){const d=V.get(p);try{const u=await Promise.race([d,new Promise((h,c)=>setTimeout(()=>c("DEDUP_TIMEOUT"),15e3))]);if(u?.data!==void 0){let h=u.data;l(A)&&(h=A(h,t,t.state)),F&&(h=F(h,t,t.state)),z(t,h,O),T(t,"onFetchComplete",h),C(e,t,"onFetchComplete",h)}}catch{}return}const Rt=!X(p)?.data;k(t,{isFetching:!0,isLoading:Rt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),T(t,"onFetchStart"),C(e,t,"onFetchStart");const M=s?.analyze?.emitNetwork,ht=M?typeof performance<"u"?performance.now():Date.now():0;M&&M({phase:"start",mode:"query",from:f,method:n,cacheKey:p,lang:dt});const vt=Dt(async()=>{if(rt!==!1&&a.auth!==!1&&a.getSession){const c=await a.getSession();if(rt===!0&&!c){const b={message:"Not authenticated"};return k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:b,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",b),C(e,t,"onFetchError",b),{data:null,error:b}}}const d=a[n];if(!l(d))return{data:null,error:{message:`Method "${n}" not found on adapter`}};const u={from:f,select:E,params:L,single:lt,limit:K,offset:at,order:j,headers:N,baseUrl:y},h=ut(t,s);if(h&&(u.headers={...u.headers,"Accept-Language":h}),g!==void 0){if(Y(g))g.offset!==void 0&&(u.offset=g.offset),g.limit!==void 0&&(u.limit=g.limit),g.cursor!==void 0&&(u.params={...u.params,cursor:g.cursor});else if(typeof g=="number"){const c=e.pageSize||K||20;u.offset=(g-1)*c,u.limit=c}}if(v!==void 0&&(u.params={...u.params,cursor:v}),n==="insert"||n==="update"||n==="upsert"){let c;if(R===!0||e.on==="submit")c=et(t);else if(x(R)){const b=et(t);c={};for(const pt of R)c[pt]=b[pt]}else t.state?.parse?c=t.state.parse():Y(t.state)&&(c={...t.state});F&&(c=F(c,t,t.state)),u.data=c}if(n==="rpc"){let c=L;if(e.on==="submit"){const b=et(t);c=e.transformParams?e.transformParams(b,t,t.state):b}u.params=c}if(n==="subscribe"){const c=a.subscribe({from:f,params:L,on:e.subscribeOn},(b,pt,Jt)=>{z(t,b,O),T(t,"onFetchComplete",b),C(e,t,"onFetchComplete",b)});return o.__unsubscribe=c,{data:null,error:null,subscribed:!0}}return d(u)},ot);p&&V.set(p,vt);try{const d=await vt;if(d?.subscribed)return;const{data:u,error:h}=d||{};if(h){p&&Z(p,null,h),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",h),C(e,t,"onFetchError",h),M&&M({phase:"error",mode:"query",from:f,method:n,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-ht});return}if(u!==void 0){if((n==="select"||n==="rpc")&&p){const b=Z(p,u,null);b.gcTime=D?.gcTime||3e5}let c=u;P&&x(u)&&(o.__pages||(o.__pages=[]),r.direction==="previous"?o.__pages.unshift(u):o.__pages.push(u),c=o.__pages.flat(),G&&(o.__nextPageParam=G(u,o.__pages),o.__hasNextPage=o.__nextPageParam!=null),S&&(o.__prevPageParam=S(u,o.__pages),o.__hasPreviousPage=o.__prevPageParam!=null)),l(A)&&(c=A(c,t,t.state)),F&&(c=F(c,t,t.state)),(!$||c!==void 0)&&z(t,c,O),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),T(t,"onFetchComplete",c),C(e,t,"onFetchComplete",c),M&&M({phase:"success",mode:"query",ok:!0,from:f,method:n,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-ht})}}catch(d){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",d),C(e,t,"onFetchError",d),M&&M({phase:"error",mode:"query",from:f,method:n,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-ht})}finally{p&&V.delete(p)}},xt=(e,t,s)=>{const r=e.on,i=t.__ref;i.__fetchListeners||(i.__fetchListeners=[]);const a=e.__runner||I;if(r==="submit"){const o=n=>{n.preventDefault(),a(e,t,s)},f=t.node;f&&(f.addEventListener("submit",o),i.__fetchListeners.push(()=>f.removeEventListener("submit",o)))}else if(r==="click"){const o=()=>a(e,t,s),f=t.node;f&&(f.addEventListener("click",o),i.__fetchListeners.push(()=>f.removeEventListener("click",o)))}else r==="stateChange"&&(i.__fetchOnStateChange=()=>a(e,t,s))},Wt=(e,t,s)=>{const r=t.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),Gt();const i=e.refetchInterval;if(i){const a=typeof i=="number"?i:H(i);if(a>0){const o=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&I(e,t,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(o))}}if(e.refetchOnWindowFocus!==!1){const a=()=>{const o=ut(t,s),f=At(t,s),n=zt(e,o,f),_=X(n),m=yt(e.cache);(!_||_.stale||Date.now()-_.time>(m?.staleTime||0))&&I(e,t,s,{force:!0})};W.focus.add(a),r.__fetchCleanups.push(()=>W.focus.delete(a))}if(e.refetchOnReconnect!==!1){const a=()=>I(e,t,s,{force:!0});W.online.add(a),r.__fetchCleanups.push(()=>W.online.delete(a))}},Kt=(e,t,s)=>{if(!t.optimistic)return null;const r=e.__ref,i=t.as,a=e.state?.parse?e.state.parse():Y(e.state)?{...e.state}:e.state;r.__optimisticSnapshot=a;const o=l(t.optimistic)?t.optimistic(s,a,e):t.optimistic;return o!==void 0&&z(e,o,i),a},wt=(e,t)=>{const s=e.__ref,r=s.__optimisticSnapshot;r!==void 0&&(z(e,r,t.as),delete s.__optimisticSnapshot)},Yt=async(e,t,s)=>{const r=s?.fetch;if(!r)return;const i=await bt(r,s);if(!i)return;const a=t.__ref,{method:o,from:f,fields:n,transform:_,as:m,on:st,auth:F,headers:lt,baseUrl:rt,invalidates:R,optimistic:O,onMutate:K,onSuccess:at,onError:j,onSettled:N}=e;let y;if(n===!0||st==="submit")y=et(t);else if(x(n)){const S=et(t);y={};for(const P of n)y[P]=S[P]}else t.state?.parse?y=t.state.parse():Y(t.state)&&(y={...t.state});_&&(y=_(y,t,t.state)),l(K)&&K(y,t,t.state);const g=O?Kt(t,e,y):null;a.__fetching=!0,k(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),T(t,"onFetchStart"),C(e,t,"onFetchStart");const v=s?.analyze?.emitNetwork,G=v?typeof performance<"u"?performance.now():Date.now():0;v&&v({phase:"start",mode:"mutation",from:f,method:o});try{if(F!==!1&&i.auth!==!1&&i.getSession){const L=await i.getSession();if(F===!0&&!L){g!==void 0&&wt(t,e);const D={message:"Not authenticated"};T(t,"onFetchError",D),C(e,t,"onFetchError",D);return}}const S=i[o];if(!l(S))return;const P={from:f,data:y,headers:lt,baseUrl:rt};e.params&&(P.params=Lt(e.params,t,s));const q=ut(t,s);q&&(P.headers={...P.headers,"Accept-Language":q});const Q=Et(e),A=await Dt(()=>S(P),Q),{data:$,error:E}=A||{};if(E){g!==void 0&&wt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:E,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",E),l(j)&&j(E,y,t),l(N)&&N(null,E,y,t),v&&v({phase:"error",mode:"mutation",from:f,method:o,error:E.message||String(E),durationMs:(typeof performance<"u"?performance.now():Date.now())-G});return}if(delete a.__optimisticSnapshot,$!==void 0){const L=m?{[m]:$}:$;t.state?.update&&t.state.update(L,{preventFetch:!0})}if(k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),T(t,"onFetchComplete",$),C(e,t,"onFetchComplete",$),l(at)&&at($,y,t),l(N)&&N($,null,y,t),v&&v({phase:"success",mode:"mutation",ok:!0,from:f,method:o,durationMs:(typeof performance<"u"?performance.now():Date.now())-G}),R){const L=x(R)?R:[R];for(const D of L)if(D===!0||D==="*")for(const[ot]of w)ot.startsWith(f+":")&&tt(ot);else tt(D)}}catch(S){g!==void 0&&wt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),T(t,"onFetchError",S),C(e,t,"onFetchError",S),l(j)&&j(S,y,t),l(N)&&N(null,S,y,t),v&&v({phase:"error",mode:"mutation",from:f,method:o,error:S.message||String(S),durationMs:(typeof performance<"u"?performance.now():Date.now())-G})}finally{a.__fetching=!1}},kt=(e,t,s,r)=>{if(!e||!r?.fetch)return;const a=Tt(e,t);if(!a)return;const o=x(a)?a.map(n=>Pt(Tt(n,t),t)).filter(Boolean):[Pt(a,t)].filter(Boolean);for(const n of o){const _=n.method==="insert"||n.method==="update"||n.method==="upsert"||n.method==="delete",m=_?Yt:I;n.on==="create"?m(n,t,r):Promise.resolve().then(()=>{xt({...n,__runner:m},t,r)}),!_&&n.on==="create"&&(n.refetchInterval||n.refetchOnWindowFocus!==!1||n.refetchOnReconnect!==!1)&&Wt(n,t,r)}const f=t.__ref;f.refetch=n=>{for(const _ of o)I(_,t,r,{force:!0,...n})},f.fetchNextPage=()=>{const n=o[0];if(!n||!n.infinite)return;const _=f.__nextPageParam;if(_==null)return;const m={...n,cursor:_};I(m,t,r,{direction:"next",force:!0})},f.fetchPreviousPage=()=>{const n=o[0];if(!n||!n.infinite)return;const _=f.__prevPageParam;if(_==null)return;const m={...n,cursor:_};I(m,t,r,{direction:"previous",force:!0})}},te={invalidateQueries:e=>{if(!e){tt();return}if(B(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&tt(t);else if(x(e)){const t=e.join(":");for(const[s]of w)s.includes(t)&&tt(s)}},removeQueries:e=>{if(!e){ft();return}if(B(e))for(const[t]of w)(t.startsWith(e)||t.includes(e))&&ft(t)},getQueryData:e=>X(e)?.data??void 0,setQueryData:(e,t)=>{const s=X(e),r=l(t)?t(s?.data):t;Z(e,r,null)},prefetchQuery:async(e,t)=>{const s=t?.fetch;if(!s)return;const r=await bt(s,t);if(!r)return;const i=e.cache?.key||`${e.from}:${e.method||"select"}:${JSON.stringify(e.params||"")}`,a=r[e.method||"select"];if(!l(a))return;const o=await a({from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single});if(o?.data!==void 0&&!o?.error){const f=Z(i,o.data,null);f.gcTime=yt(e.cache)?.gcTime||3e5}return o},getCache:()=>w,clear:()=>ft(),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[s]of w)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(t)||ft(s))}},ee={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||V.clear(),kt(t,e,e.state,e.context))}};var se=kt;export{Xt as createAdapter,se as default,kt as executeFetch,ee as fetchPlugin,St as initAdapterAuth,H as parseDuration,te as queryClient,Vt as registerAdapter,Ut as resolveDb};
|
package/index.js
CHANGED
|
@@ -195,10 +195,14 @@ const activeQueries = new Map() // key -> Promise (deduplication)
|
|
|
195
195
|
// (from, method, params) tuple yields different bodies per lang. queryClient.
|
|
196
196
|
// dropNonLang(keepLang) leans on this suffix to evict stale-language entries
|
|
197
197
|
// on a setLang() event without touching the kept lang's cache.
|
|
198
|
-
const buildCacheKey = (config, lang) => {
|
|
198
|
+
const buildCacheKey = (config, lang, scope) => {
|
|
199
199
|
if (config.cache?.key) return config.cache.key
|
|
200
200
|
const params = resolveParamsSync(config.params)
|
|
201
|
-
|
|
201
|
+
// Scope segment sits AFTER `${from}:${method}:` so `from`/`from:method`
|
|
202
|
+
// prefix matching (mutation `invalidates`, queryClient string patterns)
|
|
203
|
+
// and the trailing lang suffix (dropNonLang) are both preserved.
|
|
204
|
+
const scopeSeg = scope ? `${scope}:` : ''
|
|
205
|
+
const base = `${config.from}:${config.method}:${scopeSeg}${JSON.stringify(params || '')}`
|
|
202
206
|
return lang ? `${base}:${lang}` : base
|
|
203
207
|
}
|
|
204
208
|
|
|
@@ -397,6 +401,21 @@ const resolveLanguage = (element, context) => {
|
|
|
397
401
|
return undefined
|
|
398
402
|
}
|
|
399
403
|
|
|
404
|
+
// Tenant scope for the cache + dedup keys. A multi-tenant consumer (e.g. the
|
|
405
|
+
// workspace shell switching orgs/workspaces) sets an opaque token on root
|
|
406
|
+
// state — `root.__fetchScope` — so the SAME (from, method, params) tuple
|
|
407
|
+
// yields DIFFERENT cache/dedup keys per tenant. Without it the cache is
|
|
408
|
+
// tenant-blind: org A's cached `workspaceProject.people:list:""` entry (AND its
|
|
409
|
+
// in-flight `activeQueries` promise) is served / dedup-collapsed for org B, so a
|
|
410
|
+
// page mounted right after an org switch renders the previous tenant's rows.
|
|
411
|
+
// Read generically (same pattern as resolveLanguage) so the plugin stays
|
|
412
|
+
// app-agnostic — apps that never set it get byte-identical keys to before.
|
|
413
|
+
const resolveScope = (element, context) => {
|
|
414
|
+
const root = element?.state?.root || context?.state?.root
|
|
415
|
+
const scope = root?.__fetchScope
|
|
416
|
+
return scope ? String(scope) : undefined
|
|
417
|
+
}
|
|
418
|
+
|
|
400
419
|
const resolveParams = (params, element, context) => {
|
|
401
420
|
let resolved
|
|
402
421
|
if (!params) {
|
|
@@ -586,12 +605,17 @@ const runFetch = async (config, element, context, opts = {}) => {
|
|
|
586
605
|
const cacheConfig = parseCacheConfig(cacheRaw)
|
|
587
606
|
const retryConfig = resolveRetryConfig(config)
|
|
588
607
|
const lang = resolveLanguage(element, context)
|
|
608
|
+
const scope = resolveScope(element, context)
|
|
589
609
|
|
|
590
610
|
// Build cache key — lang suffix lets queryClient.dropNonLang(keepLang)
|
|
591
611
|
// evict stale-language entries on setLang() without flushing the rest.
|
|
612
|
+
// scopeSeg (after `${from}:${method}:`) isolates the cache + dedup keys per
|
|
613
|
+
// tenant so an org/workspace switch never serves — or dedup-collapses into —
|
|
614
|
+
// the previous tenant's entry, while keeping `from:method` as the key prefix.
|
|
592
615
|
const langSuffix = lang ? `:${lang}` : ''
|
|
616
|
+
const scopeSeg = scope ? `${scope}:` : ''
|
|
593
617
|
const cacheKey = cacheConfig
|
|
594
|
-
? (cacheRaw?.key || `${from}:${method}:${JSON.stringify(params || '')}${infinite ? ':infinite' : ''}${page ? ':p' + JSON.stringify(page) : ''}${langSuffix}`)
|
|
618
|
+
? (cacheRaw?.key || `${from}:${method}:${scopeSeg}${JSON.stringify(params || '')}${infinite ? ':infinite' : ''}${page ? ':p' + JSON.stringify(page) : ''}${langSuffix}`)
|
|
595
619
|
: null
|
|
596
620
|
|
|
597
621
|
// Apply initial/placeholder data on first mount
|
|
@@ -890,7 +914,8 @@ const bindAutoRefetch = (config, element, context) => {
|
|
|
890
914
|
if (config.refetchOnWindowFocus !== false) {
|
|
891
915
|
const onFocus = () => {
|
|
892
916
|
const lang = resolveLanguage(element, context)
|
|
893
|
-
const
|
|
917
|
+
const scope = resolveScope(element, context)
|
|
918
|
+
const cacheKey = buildCacheKey(config, lang, scope)
|
|
894
919
|
const entry = getCacheEntry(cacheKey)
|
|
895
920
|
const cacheConfig = parseCacheConfig(config.cache)
|
|
896
921
|
if (!entry || entry.stale || (Date.now() - entry.time) > (cacheConfig?.staleTime || 0)) {
|