@symbo.ls/fetch 3.14.105 → 3.14.285

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 CHANGED
@@ -1,10 +1,26 @@
1
1
  # @symbo.ls/fetch
2
2
 
3
+ ## 3.14.285
4
+
5
+ ### Patch Changes
6
+
7
+ - Auto-generated cross-repo patch release.
8
+
9
+ ## 3.14.201
10
+
11
+ ### Patch Changes
12
+
13
+ - Auto-generated cross-repo patch release.
14
+
3
15
  ## 3.14.105
4
16
 
5
17
  ### Patch Changes
6
18
 
7
- - @symbo.ls/utils@3.14.105
19
+ - Manual patch bump triggered via workflow_dispatch (scope: all).
20
+ No source change behind this bump — released to refresh dist or
21
+ coordinate a cross-package version line.
22
+ - Updated dependencies
23
+ - @symbo.ls/utils@3.14.105
8
24
 
9
25
  ## 3.14.104
10
26
 
package/dist/cjs/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var At=Object.create;var st=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var $t=Object.getPrototypeOf,Rt=Object.prototype.hasOwnProperty;var It=(e,t)=>{for(var s in t)st(e,s,{get:t[s],enumerable:!0})},wt=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Mt(t))!Rt.call(e,n)&&n!==s&&st(e,n,{get:()=>t[n],enumerable:!(r=kt(t,n))||r.enumerable});return e};var dt=(e,t,s)=>(s=e!=null?At($t(e)):{},wt(t||!e||!e.__esModule?st(s,"default",{value:e,enumerable:!0}):s,e)),Nt=e=>wt(st({},"__esModule",{value:!0}),e);var Xt={};It(Xt,{createAdapter:()=>Ut,default:()=>Vt,executeFetch:()=>gt,fetchPlugin:()=>Ht,initAdapterAuth:()=>ot,parseDuration:()=>K,queryClient:()=>Jt,registerAdapter:()=>zt,resolveDb:()=>Et});module.exports=Nt(Xt);var f=require("@symbo.ls/utils");const qt=["select","rpc","insert","update","delete","subscribe"],Ot={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},rt=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),bt=(()=>{if(typeof globalThis<"u"&&globalThis[rt])return globalThis[rt];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,rt,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[rt]}catch{}return e})(),zt=(e,t)=>{bt[e]=t},Ut=e=>{const t={};for(const s of qt)e[s]&&(t[s]=e[s]);return t.name=e.name||"custom",t},Et=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;const n=bt[r]||Ot[r];if(!n)throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await n();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)},K=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},b=new Map,z=new Map,B=new Map,xt=(e,t)=>{if(e.cache?.key)return e.cache.key;const s=Wt(e.params),r=`${e.from}:${e.method}:${JSON.stringify(s||"")}`;return t?`${r}:${t}`:r},G=e=>b.get(e)||null,J=(e,t,s)=>{const r=b.get(e),n={data:t,error:s,time:Date.now(),stale:!1};b.set(e,n);const a=z.get(e);if(a)for(const i of a)(0,f.isFunction)(i)&&i(n);return n},H=e=>{if(e){const t=b.get(e);t&&(t.stale=!0);return}for(const[,t]of b)t.stale=!0},at=e=>{if(e){b.delete(e);return}b.clear()},se=(e,t)=>(z.has(e)||z.set(e,new Set),z.get(e).add(t),()=>{const s=z.get(e);s&&(s.delete(t),s.size===0&&z.delete(e))}),ht=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:K(e),gcTime:3e5}:{staleTime:K(e.stale||e.staleTime)||6e4,gcTime:K(e.gc||e.gcTime||e.expire)||3e5,key:e.key};let it=null;const Qt=()=>{it||(it=setInterval(()=>{const e=Date.now();for(const[t,s]of b){const r=z.get(t);!(r&&r.size>0)&&e-s.time>(s.gcTime||3e5)&&b.delete(t)}},3e4),it.unref&&it.unref())};Qt();const mt=3,pt=e=>Math.min(1e3*2**e,3e4),vt=e=>{const t=e.retry;return t===!1?{count:0}:t===!0||t===void 0?{count:mt,delay:pt}:typeof t=="number"?{count:t,delay:pt}:{count:t.count??mt,delay:(0,f.isFunction)(t.delay)?t.delay:typeof t.delay=="number"?()=>t.delay:pt}},Ft=async(e,t)=>{const{count:s,delay:r}=t;let n;for(let a=0;a<=s;a++)try{const i=await e();if(i?.error){if(n=i.error,a<s){const c=(0,f.isFunction)(r)?r(a,n):r;await new Promise(o=>setTimeout(o,c));continue}return i}return i}catch(i){if(n=i,a<s){const c=(0,f.isFunction)(r)?r(a,i):r;await new Promise(o=>setTimeout(o,c));continue}throw i}return{data:null,error:n}},W={focus:new Set,online:new Set};let Tt=!1;const jt=()=>{if(Tt||typeof window>"u")return;Tt=!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)},Dt=(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},Wt=e=>(!e||(0,f.isFunction)(e),e),nt=(e,t)=>{const s=e?.state?.root||t?.state?.root;if(s?.lang)return s.lang},Ct=(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 n in e){const a=e[n];r[n]=(0,f.isFunction)(a)?a(t,t.state):a}}return r},ot=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const s=(r,n)=>{const a=t.state?.root;a?.update&&a.update({auth:{user:r,session:n,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,n)=>{s(n?.user||null,n)})},_t=async(e,t)=>{if((0,f.isFunction)(e.select))return e.auth!==!1&&await ot(e,t),e;if(e.__resolved)return e.auth!==!1&&await ot(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=Et(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 ot(s,t),s):null},v=(e,t,...s)=>{const r=(0,f.isFunction)(e[t])?e[t]:null;r&&r.call(e,...s,e,e.state,e.context)},E=(e,t,s,...r)=>{const n=e&&(0,f.isFunction)(e[s])?e[s]:null;n&&n.call(t,...r,t,t.state,t.context)},V=e=>{const t={},s=e.node;if(!s)return t;if(s.tagName==="FORM"){const n=new FormData(s);for(const[a,i]of n.entries())t[a]=i;return t}const r=s.querySelectorAll("input, textarea, select");for(let n=0;n<r.length;n++){const a=r[n],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},U=(e,t,s,r={})=>{const n=s&&s.startsWith("~/"),a=n&&e.state?.root||e.state;if(a?.update)if(n){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)},N=async(e,t,s,r={})=>{const n=s?.fetch;if(!n||!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 _t(n,s);if(!a||!t.__ref)return;const i=t.__ref,{from:c,method:o,query:y,params:F,cache:X,transform:T,single:ft,auth:Z,fields:R,as:q,limit:Y,offset:tt,order:x,headers:I,baseUrl:_,page:g,cursor:m,getNextPageParam:Q,getPreviousPageParam:S,infinite:P,placeholderData:O,initialData:j,select:L,keepPreviousData:M}=e;let D=(0,f.isString)(L)?L:void 0;if(y&&(0,f.isFunction)(t.getQuery)){const d=t.getQuery(a.name||"paths");d&&(D=d.select||d.length&&d.join(",")||D)}const A=Ct(F,t,s),C=ht(X),et=vt(e),ct=nt(t,s),Pt=ct?`:${ct}`:"",p=C?X?.key||`${c}:${o}:${JSON.stringify(A||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${Pt}`:null;if(!i.__fetchInitialized&&p&&(i.__fetchInitialized=!0,j!==void 0)){const d=(0,f.isFunction)(j)?j():j;J(p,d,null)}if((o==="select"||o==="rpc")&&p&&C){const d=G(p);if(d&&!d.error){const l=Date.now()-d.time,h=d.stale||l>(C.staleTime||0);let u=d.data;if((0,f.isFunction)(L)&&(u=L(u,t,t.state)),T&&(u=T(u,t,t.state)),U(t,u,q),!h){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(O!==void 0){const l=(0,f.isFunction)(O)?O(t,t.state):O;l!==void 0&&U(t,l,q)}}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)(L)&&(h=L(h,t,t.state)),T&&(h=T(h,t,t.state)),U(t,h,q),v(t,"onFetchComplete",h),E(e,t,"onFetchComplete",h)}}catch{}return}const Lt=!G(p)?.data;k(t,{isFetching:!0,isLoading:Lt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(t,"onFetchStart"),E(e,t,"onFetchStart");const $=s?.analyze?.emitNetwork,ut=$?typeof performance<"u"?performance.now():Date.now():0;$&&$({phase:"start",mode:"query",from:c,method:o,cacheKey:p,lang:ct});const St=Ft(async()=>{if(Z!==!1&&a.auth!==!1&&a.getSession){const u=await a.getSession();if(Z===!0&&!u){const w={message:"Not authenticated"};return k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:w,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",w),E(e,t,"onFetchError",w),{data:null,error:w}}}const d=a[o];if(!(0,f.isFunction)(d))return{data:null,error:{message:`Method "${o}" not found on adapter`}};const l={from:c,select:D,params:A,single:ft,limit:Y,offset:tt,order:x,headers:I,baseUrl:_},h=nt(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||Y||20;l.offset=(g-1)*u,l.limit=u}}if(m!==void 0&&(l.params={...l.params,cursor:m}),o==="insert"||o==="update"||o==="upsert"){let u;if(R===!0||e.on==="submit")u=V(t);else if((0,f.isArray)(R)){const w=V(t);u={};for(const lt of R)u[lt]=w[lt]}else t.state?.parse?u=t.state.parse():(0,f.isObject)(t.state)&&(u={...t.state});T&&(u=T(u,t,t.state)),l.data=u}if(o==="rpc"){let u=A;if(e.on==="submit"){const w=V(t);u=e.transformParams?e.transformParams(w,t,t.state):w}l.params=u}if(o==="subscribe"){const u=a.subscribe({from:c,params:A,on:e.subscribeOn},(w,lt,te)=>{U(t,w,q),v(t,"onFetchComplete",w),E(e,t,"onFetchComplete",w)});return i.__unsubscribe=u,{data:null,error:null,subscribed:!0}}return d(l)},et);p&&B.set(p,St);try{const d=await St;if(d?.subscribed)return;const{data:l,error:h}=d||{};if(h){p&&J(p,null,h),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",h),E(e,t,"onFetchError",h),$&&$({phase:"error",mode:"query",from:c,method:o,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-ut});return}if(l!==void 0){if((o==="select"||o==="rpc")&&p){const w=J(p,l,null);w.gcTime=C?.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(),Q&&(i.__nextPageParam=Q(l,i.__pages),i.__hasNextPage=i.__nextPageParam!=null),S&&(i.__prevPageParam=S(l,i.__pages),i.__hasPreviousPage=i.__prevPageParam!=null)),(0,f.isFunction)(L)&&(u=L(u,t,t.state)),T&&(u=T(u,t,t.state)),(!M||u!==void 0)&&U(t,u,q),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",u),E(e,t,"onFetchComplete",u),$&&$({phase:"success",mode:"query",ok:!0,from:c,method:o,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-ut})}}catch(d){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",d),E(e,t,"onFetchError",d),$&&$({phase:"error",mode:"query",from:c,method:o,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-ut})}finally{p&&B.delete(p)}},Kt=(e,t,s)=>{const r=e.on,n=t.__ref;n.__fetchListeners||(n.__fetchListeners=[]);const a=e.__runner||N;if(r==="submit"){const i=o=>{o.preventDefault(),a(e,t,s)},c=t.node;c&&(c.addEventListener("submit",i),n.__fetchListeners.push(()=>c.removeEventListener("submit",i)))}else if(r==="click"){const i=()=>a(e,t,s),c=t.node;c&&(c.addEventListener("click",i),n.__fetchListeners.push(()=>c.removeEventListener("click",i)))}else r==="stateChange"&&(n.__fetchOnStateChange=()=>a(e,t,s))},Yt=(e,t,s)=>{const r=t.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),jt();const n=e.refetchInterval;if(n){const a=typeof n=="number"?n:K(n);if(a>0){const i=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&N(e,t,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(i))}}if(e.refetchOnWindowFocus!==!1){const a=()=>{const i=nt(t,s),c=xt(e,i),o=G(c),y=ht(e.cache);(!o||o.stale||Date.now()-o.time>(y?.staleTime||0))&&N(e,t,s,{force:!0})};W.focus.add(a),r.__fetchCleanups.push(()=>W.focus.delete(a))}if(e.refetchOnReconnect!==!1){const a=()=>N(e,t,s,{force:!0});W.online.add(a),r.__fetchCleanups.push(()=>W.online.delete(a))}},Bt=(e,t,s)=>{if(!t.optimistic)return null;const r=e.__ref,n=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&&U(e,i,n),a},yt=(e,t)=>{const s=e.__ref,r=s.__optimisticSnapshot;r!==void 0&&(U(e,r,t.as),delete s.__optimisticSnapshot)},Gt=async(e,t,s)=>{const r=s?.fetch;if(!r)return;const n=await _t(r,s);if(!n)return;const a=t.__ref,{method:i,from:c,fields:o,transform:y,as:F,on:X,auth:T,headers:ft,baseUrl:Z,invalidates:R,optimistic:q,onMutate:Y,onSuccess:tt,onError:x,onSettled:I}=e;let _;if(o===!0||X==="submit")_=V(t);else if((0,f.isArray)(o)){const S=V(t);_={};for(const P of o)_[P]=S[P]}else t.state?.parse?_=t.state.parse():(0,f.isObject)(t.state)&&(_={...t.state});y&&(_=y(_,t,t.state)),(0,f.isFunction)(Y)&&Y(_,t,t.state);const g=q?Bt(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"),E(e,t,"onFetchStart");const m=s?.analyze?.emitNetwork,Q=m?typeof performance<"u"?performance.now():Date.now():0;m&&m({phase:"start",mode:"mutation",from:c,method:i});try{if(T!==!1&&n.auth!==!1&&n.getSession){const A=await n.getSession();if(T===!0&&!A){g!==void 0&&yt(t,e);const C={message:"Not authenticated"};v(t,"onFetchError",C),E(e,t,"onFetchError",C);return}}const S=n[i];if(!(0,f.isFunction)(S))return;const P={from:c,data:_,headers:ft,baseUrl:Z};e.params&&(P.params=Ct(e.params,t,s));const O=nt(t,s);O&&(P.headers={...P.headers,"Accept-Language":O});const j=vt(e),L=await Ft(()=>S(P),j),{data:M,error:D}=L||{};if(D){g!==void 0&&yt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:D,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",D),(0,f.isFunction)(x)&&x(D,_,t),(0,f.isFunction)(I)&&I(null,D,_,t),m&&m({phase:"error",mode:"mutation",from:c,method:i,error:D.message||String(D),durationMs:(typeof performance<"u"?performance.now():Date.now())-Q});return}if(delete a.__optimisticSnapshot,M!==void 0){const A=F?{[F]:M}:M;t.state?.update&&t.state.update(A,{preventFetch:!0})}if(k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",M),E(e,t,"onFetchComplete",M),(0,f.isFunction)(tt)&&tt(M,_,t),(0,f.isFunction)(I)&&I(M,null,_,t),m&&m({phase:"success",mode:"mutation",ok:!0,from:c,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-Q}),R){const A=(0,f.isArray)(R)?R:[R];for(const C of A)if(C===!0||C==="*")for(const[et]of b)et.startsWith(c+":")&&H(et);else H(C)}}catch(S){g!==void 0&&yt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",S),E(e,t,"onFetchError",S),(0,f.isFunction)(x)&&x(S,_,t),(0,f.isFunction)(I)&&I(null,S,_,t),m&&m({phase:"error",mode:"mutation",from:c,method:i,error:S.message||String(S),durationMs:(typeof performance<"u"?performance.now():Date.now())-Q})}finally{a.__fetching=!1}},gt=(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(o=>Dt((0,f.exec)(o,t),t)).filter(Boolean):[Dt(a,t)].filter(Boolean);for(const o of i){const y=o.method==="insert"||o.method==="update"||o.method==="upsert"||o.method==="delete",F=y?Gt:N;o.on==="create"?F(o,t,r):Promise.resolve().then(()=>{Kt({...o,__runner:F},t,r)}),!y&&o.on==="create"&&(o.refetchInterval||o.refetchOnWindowFocus!==!1||o.refetchOnReconnect!==!1)&&Yt(o,t,r)}const c=t.__ref;c.refetch=o=>{for(const y of i)N(y,t,r,{force:!0,...o})},c.fetchNextPage=()=>{const o=i[0];if(!o||!o.infinite)return;const y=c.__nextPageParam;if(y==null)return;const F={...o,cursor:y};N(F,t,r,{direction:"next",force:!0})},c.fetchPreviousPage=()=>{const o=i[0];if(!o||!o.infinite)return;const y=c.__prevPageParam;if(y==null)return;const F={...o,cursor:y};N(F,t,r,{direction:"previous",force:!0})}},Jt={invalidateQueries:e=>{if(!e){H();return}if((0,f.isString)(e))for(const[t]of b)(t.startsWith(e)||t.includes(e))&&H(t);else if((0,f.isArray)(e)){const t=e.join(":");for(const[s]of b)s.includes(t)&&H(s)}},removeQueries:e=>{if(!e){at();return}if((0,f.isString)(e))for(const[t]of b)(t.startsWith(e)||t.includes(e))&&at(t)},getQueryData:e=>G(e)?.data??void 0,setQueryData:(e,t)=>{const s=G(e),r=(0,f.isFunction)(t)?t(s?.data):t;J(e,r,null)},prefetchQuery:async(e,t)=>{const s=t?.fetch;if(!s)return;const r=await _t(s,t);if(!r)return;const n=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=J(n,i.data,null);c.gcTime=ht(e.cache)?.gcTime||3e5}return i},getCache:()=>b,clear:()=>at(),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[s]of b)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(t)||at(s))}},Ht={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||B.clear(),gt(t,e,e.state,e.context))}};var Vt=gt;
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;
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- import{isArray as W,isFunction as l,isObject as B,isString as G,exec as wt}from"@symbo.ls/utils";const At=["select","rpc","insert","update","delete","subscribe"],kt={supabase:()=>import("./adapters/supabase.js"),rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},it=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),bt=(()=>{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})(),Wt=(e,t)=>{bt[e]=t},Kt=e=>{const t={};for(const s of At)e[s]&&(t[s]=e[s]);return t.name=e.name||"custom",t},Mt=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;const n=bt[r]||kt[r];if(!n)throw new Error(`Unknown db adapter: "${r}". Use registerAdapter() for adapters with optional deps.`);const a=await n();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)},J=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},b=new Map,z=new Map,H=new Map,$t=(e,t)=>{if(e.cache?.key)return e.cache.key;const s=Nt(e.params),r=`${e.from}:${e.method}:${JSON.stringify(s||"")}`;return t?`${r}:${t}`:r},V=e=>b.get(e)||null,X=(e,t,s)=>{const r=b.get(e),n={data:t,error:s,time:Date.now(),stale:!1};b.set(e,n);const a=z.get(e);if(a)for(const i of a)l(i)&&i(n);return n},Z=e=>{if(e){const t=b.get(e);t&&(t.stale=!0);return}for(const[,t]of b)t.stale=!0},nt=e=>{if(e){b.delete(e);return}b.clear()},Yt=(e,t)=>(z.has(e)||z.set(e,new Set),z.get(e).add(t),()=>{const s=z.get(e);s&&(s.delete(t),s.size===0&&z.delete(e))}),ht=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)}:G(e)?{staleTime:J(e),gcTime:3e5}:{staleTime:J(e.stale||e.staleTime)||6e4,gcTime:J(e.gc||e.gcTime||e.expire)||3e5,key:e.key};let ot=null;const Rt=()=>{ot||(ot=setInterval(()=>{const e=Date.now();for(const[t,s]of b){const r=z.get(t);!(r&&r.size>0)&&e-s.time>(s.gcTime||3e5)&&b.delete(t)}},3e4),ot.unref&&ot.unref())};Rt();const mt=3,pt=e=>Math.min(1e3*2**e,3e4),vt=e=>{const t=e.retry;return t===!1?{count:0}:t===!0||t===void 0?{count:mt,delay:pt}:typeof t=="number"?{count:t,delay:pt}:{count:t.count??mt,delay:l(t.delay)?t.delay:typeof t.delay=="number"?()=>t.delay:pt}},Ft=async(e,t)=>{const{count:s,delay:r}=t;let n;for(let a=0;a<=s;a++)try{const i=await e();if(i?.error){if(n=i.error,a<s){const f=l(r)?r(a,n):r;await new Promise(o=>setTimeout(o,f));continue}return i}return i}catch(i){if(n=i,a<s){const f=l(r)?r(a,i):r;await new Promise(o=>setTimeout(o,f));continue}throw i}return{data:null,error:n}},K={focus:new Set,online:new Set};let Tt=!1;const It=()=>{if(Tt||typeof window>"u")return;Tt=!0;const e=()=>{for(const s of K.focus)s()},t=()=>{for(const s of K.online)s()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},Dt=(e,t)=>{const s=t.__ref;if(e===!0)return{from:s.__state||t.key,method:"select",query:!0,on:"create"};if(G(e))return{from:e,method:"select",query:!0,on:"create"};if(B(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},Nt=e=>(!e||l(e),e),ft=(e,t)=>{const s=e?.state?.root||t?.state?.root;if(s?.lang)return s.lang},Ct=(e,t,s)=>{let r;if(!e)r=void 0;else if(l(e))r=e(t,t.state);else{r={};for(const n in e){const a=e[n];r[n]=l(a)?a(t,t.state):a}}return r},_t=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const s=(r,n)=>{const a=t.state?.root;a?.update&&a.update({auth:{user:r,session:n,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,n)=>{s(n?.user||null,n)})},yt=async(e,t)=>{if(l(e.select))return e.auth!==!1&&await _t(e,t),e;if(e.__resolved)return e.auth!==!1&&await _t(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=Mt(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 _t(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)},E=(e,t,s,...r)=>{const n=e&&l(e[s])?e[s]:null;n&&n.call(t,...r,t,t.state,t.context)},tt=e=>{const t={},s=e.node;if(!s)return t;if(s.tagName==="FORM"){const n=new FormData(s);for(const[a,i]of n.entries())t[a]=i;return t}const r=s.querySelectorAll("input, textarea, select");for(let n=0;n<r.length;n++){const a=r[n],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},U=(e,t,s,r={})=>{const n=s&&s.startsWith("~/"),a=n&&e.state?.root||e.state;if(a?.update)if(n){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)},N=async(e,t,s,r={})=>{const n=s?.fetch;if(!n||!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 yt(n,s);if(!a||!t.__ref)return;const i=t.__ref,{from:f,method:o,query:y,params:F,cache:et,transform:T,single:ct,auth:st,fields:R,as:q,limit:Y,offset:rt,order:x,headers:I,baseUrl:_,page:g,cursor:m,getNextPageParam:Q,getPreviousPageParam:S,infinite:P,placeholderData:O,initialData:j,select:L,keepPreviousData:M}=e;let D=G(L)?L:void 0;if(y&&l(t.getQuery)){const d=t.getQuery(a.name||"paths");d&&(D=d.select||d.length&&d.join(",")||D)}const A=Ct(F,t,s),C=ht(et),at=vt(e),ut=ft(t,s),Pt=ut?`:${ut}`:"",p=C?et?.key||`${f}:${o}:${JSON.stringify(A||"")}${P?":infinite":""}${g?":p"+JSON.stringify(g):""}${Pt}`:null;if(!i.__fetchInitialized&&p&&(i.__fetchInitialized=!0,j!==void 0)){const d=l(j)?j():j;X(p,d,null)}if((o==="select"||o==="rpc")&&p&&C){const d=V(p);if(d&&!d.error){const u=Date.now()-d.time,h=d.stale||u>(C.staleTime||0);let c=d.data;if(l(L)&&(c=L(c,t,t.state)),T&&(c=T(c,t,t.state)),U(t,c,q),!h){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"});return}}else if(O!==void 0){const u=l(O)?O(t,t.state):O;u!==void 0&&U(t,u,q)}}if(p&&H.has(p)&&!r.force){const d=H.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(L)&&(h=L(h,t,t.state)),T&&(h=T(h,t,t.state)),U(t,h,q),v(t,"onFetchComplete",h),E(e,t,"onFetchComplete",h)}}catch{}return}const Lt=!V(p)?.data;k(t,{isFetching:!0,isLoading:Lt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),v(t,"onFetchStart"),E(e,t,"onFetchStart");const $=s?.analyze?.emitNetwork,lt=$?typeof performance<"u"?performance.now():Date.now():0;$&&$({phase:"start",mode:"query",from:f,method:o,cacheKey:p,lang:ut});const St=Ft(async()=>{if(st!==!1&&a.auth!==!1&&a.getSession){const c=await a.getSession();if(st===!0&&!c){const w={message:"Not authenticated"};return k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:w,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",w),E(e,t,"onFetchError",w),{data:null,error:w}}}const d=a[o];if(!l(d))return{data:null,error:{message:`Method "${o}" not found on adapter`}};const u={from:f,select:D,params:A,single:ct,limit:Y,offset:rt,order:x,headers:I,baseUrl:_},h=ft(t,s);if(h&&(u.headers={...u.headers,"Accept-Language":h}),g!==void 0){if(B(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||Y||20;u.offset=(g-1)*c,u.limit=c}}if(m!==void 0&&(u.params={...u.params,cursor:m}),o==="insert"||o==="update"||o==="upsert"){let c;if(R===!0||e.on==="submit")c=tt(t);else if(W(R)){const w=tt(t);c={};for(const dt of R)c[dt]=w[dt]}else t.state?.parse?c=t.state.parse():B(t.state)&&(c={...t.state});T&&(c=T(c,t,t.state)),u.data=c}if(o==="rpc"){let c=A;if(e.on==="submit"){const w=tt(t);c=e.transformParams?e.transformParams(w,t,t.state):w}u.params=c}if(o==="subscribe"){const c=a.subscribe({from:f,params:A,on:e.subscribeOn},(w,dt,Qt)=>{U(t,w,q),v(t,"onFetchComplete",w),E(e,t,"onFetchComplete",w)});return i.__unsubscribe=c,{data:null,error:null,subscribed:!0}}return d(u)},at);p&&H.set(p,St);try{const d=await St;if(d?.subscribed)return;const{data:u,error:h}=d||{};if(h){p&&X(p,null,h),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:h,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",h),E(e,t,"onFetchError",h),$&&$({phase:"error",mode:"query",from:f,method:o,cacheKey:p,error:h.message||h,durationMs:(typeof performance<"u"?performance.now():Date.now())-lt});return}if(u!==void 0){if((o==="select"||o==="rpc")&&p){const w=X(p,u,null);w.gcTime=C?.gcTime||3e5}let c=u;P&&W(u)&&(i.__pages||(i.__pages=[]),r.direction==="previous"?i.__pages.unshift(u):i.__pages.push(u),c=i.__pages.flat(),Q&&(i.__nextPageParam=Q(u,i.__pages),i.__hasNextPage=i.__nextPageParam!=null),S&&(i.__prevPageParam=S(u,i.__pages),i.__hasPreviousPage=i.__prevPageParam!=null)),l(L)&&(c=L(c,t,t.state)),T&&(c=T(c,t,t.state)),(!M||c!==void 0)&&U(t,c,q),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",c),E(e,t,"onFetchComplete",c),$&&$({phase:"success",mode:"query",ok:!0,from:f,method:o,cacheKey:p,durationMs:(typeof performance<"u"?performance.now():Date.now())-lt})}}catch(d){k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:d,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",d),E(e,t,"onFetchError",d),$&&$({phase:"error",mode:"query",from:f,method:o,cacheKey:p,error:d.message||String(d),durationMs:(typeof performance<"u"?performance.now():Date.now())-lt})}finally{p&&H.delete(p)}},qt=(e,t,s)=>{const r=e.on,n=t.__ref;n.__fetchListeners||(n.__fetchListeners=[]);const a=e.__runner||N;if(r==="submit"){const i=o=>{o.preventDefault(),a(e,t,s)},f=t.node;f&&(f.addEventListener("submit",i),n.__fetchListeners.push(()=>f.removeEventListener("submit",i)))}else if(r==="click"){const i=()=>a(e,t,s),f=t.node;f&&(f.addEventListener("click",i),n.__fetchListeners.push(()=>f.removeEventListener("click",i)))}else r==="stateChange"&&(n.__fetchOnStateChange=()=>a(e,t,s))},Ot=(e,t,s)=>{const r=t.__ref;r.__fetchCleanups||(r.__fetchCleanups=[]),It();const n=e.refetchInterval;if(n){const a=typeof n=="number"?n:J(n);if(a>0){const i=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&N(e,t,s,{force:!0})},a);r.__fetchCleanups.push(()=>clearInterval(i))}}if(e.refetchOnWindowFocus!==!1){const a=()=>{const i=ft(t,s),f=$t(e,i),o=V(f),y=ht(e.cache);(!o||o.stale||Date.now()-o.time>(y?.staleTime||0))&&N(e,t,s,{force:!0})};K.focus.add(a),r.__fetchCleanups.push(()=>K.focus.delete(a))}if(e.refetchOnReconnect!==!1){const a=()=>N(e,t,s,{force:!0});K.online.add(a),r.__fetchCleanups.push(()=>K.online.delete(a))}},zt=(e,t,s)=>{if(!t.optimistic)return null;const r=e.__ref,n=t.as,a=e.state?.parse?e.state.parse():B(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&&U(e,i,n),a},gt=(e,t)=>{const s=e.__ref,r=s.__optimisticSnapshot;r!==void 0&&(U(e,r,t.as),delete s.__optimisticSnapshot)},Ut=async(e,t,s)=>{const r=s?.fetch;if(!r)return;const n=await yt(r,s);if(!n)return;const a=t.__ref,{method:i,from:f,fields:o,transform:y,as:F,on:et,auth:T,headers:ct,baseUrl:st,invalidates:R,optimistic:q,onMutate:Y,onSuccess:rt,onError:x,onSettled:I}=e;let _;if(o===!0||et==="submit")_=tt(t);else if(W(o)){const S=tt(t);_={};for(const P of o)_[P]=S[P]}else t.state?.parse?_=t.state.parse():B(t.state)&&(_={...t.state});y&&(_=y(_,t,t.state)),l(Y)&&Y(_,t,t.state);const g=q?zt(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"),E(e,t,"onFetchStart");const m=s?.analyze?.emitNetwork,Q=m?typeof performance<"u"?performance.now():Date.now():0;m&&m({phase:"start",mode:"mutation",from:f,method:i});try{if(T!==!1&&n.auth!==!1&&n.getSession){const A=await n.getSession();if(T===!0&&!A){g!==void 0&&gt(t,e);const C={message:"Not authenticated"};v(t,"onFetchError",C),E(e,t,"onFetchError",C);return}}const S=n[i];if(!l(S))return;const P={from:f,data:_,headers:ct,baseUrl:st};e.params&&(P.params=Ct(e.params,t,s));const O=ft(t,s);O&&(P.headers={...P.headers,"Accept-Language":O});const j=vt(e),L=await Ft(()=>S(P),j),{data:M,error:D}=L||{};if(D){g!==void 0&&gt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:D,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",D),l(x)&&x(D,_,t),l(I)&&I(null,D,_,t),m&&m({phase:"error",mode:"mutation",from:f,method:i,error:D.message||String(D),durationMs:(typeof performance<"u"?performance.now():Date.now())-Q});return}if(delete a.__optimisticSnapshot,M!==void 0){const A=F?{[F]:M}:M;t.state?.update&&t.state.update(A,{preventFetch:!0})}if(k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),v(t,"onFetchComplete",M),E(e,t,"onFetchComplete",M),l(rt)&&rt(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())-Q}),R){const A=W(R)?R:[R];for(const C of A)if(C===!0||C==="*")for(const[at]of b)at.startsWith(f+":")&&Z(at);else Z(C)}}catch(S){g!==void 0&&gt(t,e),k(t,{isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:S,status:"error",fetchStatus:"idle"}),v(t,"onFetchError",S),E(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())-Q})}finally{a.__fetching=!1}},Et=(e,t,s,r)=>{if(!e||!r?.fetch)return;const a=wt(e,t);if(!a)return;const i=W(a)?a.map(o=>Dt(wt(o,t),t)).filter(Boolean):[Dt(a,t)].filter(Boolean);for(const o of i){const y=o.method==="insert"||o.method==="update"||o.method==="upsert"||o.method==="delete",F=y?Ut:N;o.on==="create"?F(o,t,r):Promise.resolve().then(()=>{qt({...o,__runner:F},t,r)}),!y&&o.on==="create"&&(o.refetchInterval||o.refetchOnWindowFocus!==!1||o.refetchOnReconnect!==!1)&&Ot(o,t,r)}const f=t.__ref;f.refetch=o=>{for(const y of i)N(y,t,r,{force:!0,...o})},f.fetchNextPage=()=>{const o=i[0];if(!o||!o.infinite)return;const y=f.__nextPageParam;if(y==null)return;const F={...o,cursor:y};N(F,t,r,{direction:"next",force:!0})},f.fetchPreviousPage=()=>{const o=i[0];if(!o||!o.infinite)return;const y=f.__prevPageParam;if(y==null)return;const F={...o,cursor:y};N(F,t,r,{direction:"previous",force:!0})}},Bt={invalidateQueries:e=>{if(!e){Z();return}if(G(e))for(const[t]of b)(t.startsWith(e)||t.includes(e))&&Z(t);else if(W(e)){const t=e.join(":");for(const[s]of b)s.includes(t)&&Z(s)}},removeQueries:e=>{if(!e){nt();return}if(G(e))for(const[t]of b)(t.startsWith(e)||t.includes(e))&&nt(t)},getQueryData:e=>V(e)?.data??void 0,setQueryData:(e,t)=>{const s=V(e),r=l(t)?t(s?.data):t;X(e,r,null)},prefetchQuery:async(e,t)=>{const s=t?.fetch;if(!s)return;const r=await yt(s,t);if(!r)return;const n=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=X(n,i.data,null);f.gcTime=ht(e.cache)?.gcTime||3e5}return i},getCache:()=>b,clear:()=>nt(),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[s]of b)s.match(/:([a-z]{2,3})$/i)&&(s.endsWith(t)||nt(s))}},Gt={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||H.clear(),Et(t,e,e.state,e.context))}};var Jt=Et;export{Kt as createAdapter,Jt as default,Et as executeFetch,Gt as fetchPlugin,_t as initAdapterAuth,J as parseDuration,Bt as queryClient,Wt as registerAdapter,Mt as resolveDb};
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};
package/index.js CHANGED
@@ -63,8 +63,64 @@ const CUSTOM_ADAPTERS = (() => {
63
63
  return fresh
64
64
  })()
65
65
 
66
+ // Boot-race tolerance for custom adapters. An element with
67
+ // `fetch: { adapter: 'X' }` can be created before `registerAdapter('X', …)`
68
+ // runs (e.g. the workspace's eager 'sdk' registration in bootShell lands a
69
+ // tick after the shell's first synchronous create() burst). Rather than throw
70
+ // on that ordering, resolveDb waits briefly for the registration to arrive.
71
+ // Pending resolvers live on globalThis (same Symbol.for cross-copy rationale
72
+ // as CUSTOM_ADAPTERS) so a registerAdapter in any module copy wakes a
73
+ // resolveDb that is waiting in any other copy.
74
+ const _PENDING_KEY = Symbol.for('@symbo.ls/fetch:PENDING_ADAPTERS')
75
+ const PENDING_RESOLVERS = (() => {
76
+ if (typeof globalThis !== 'undefined' && globalThis[_PENDING_KEY]) {
77
+ return globalThis[_PENDING_KEY]
78
+ }
79
+ const fresh = {}
80
+ if (typeof globalThis !== 'undefined') {
81
+ try {
82
+ Object.defineProperty(globalThis, _PENDING_KEY, {
83
+ value: fresh,
84
+ writable: false,
85
+ configurable: false,
86
+ enumerable: false
87
+ })
88
+ return globalThis[_PENDING_KEY]
89
+ } catch (_) { /* sealed globalThis — fall through to module-local */ }
90
+ }
91
+ return fresh
92
+ })()
93
+
94
+ // How long resolveDb waits for a not-yet-registered custom adapter before
95
+ // giving up and throwing. Long enough to cover the shell's boot/auth gate
96
+ // (custom adapters register early), short enough that a genuine typo still
97
+ // surfaces loudly rather than hanging forever.
98
+ const _ADAPTER_REGISTRATION_TIMEOUT = 5000
99
+
100
+ const _waitForCustomAdapter = (name) =>
101
+ new Promise((resolve) => {
102
+ // Re-check synchronously — it may have registered between the miss in
103
+ // resolveDb and this microtask.
104
+ if (CUSTOM_ADAPTERS[name]) return resolve(CUSTOM_ADAPTERS[name])
105
+ const waiters = (PENDING_RESOLVERS[name] ||= [])
106
+ let settled = false
107
+ const settle = () => {
108
+ if (settled) return
109
+ settled = true
110
+ resolve(CUSTOM_ADAPTERS[name] || null)
111
+ }
112
+ waiters.push(settle)
113
+ setTimeout(settle, _ADAPTER_REGISTRATION_TIMEOUT)
114
+ })
115
+
66
116
  export const registerAdapter = (name, loader) => {
67
117
  CUSTOM_ADAPTERS[name] = loader
118
+ // Wake any resolveDb calls that raced ahead of this registration.
119
+ const waiters = PENDING_RESOLVERS[name]
120
+ if (waiters && waiters.length) {
121
+ PENDING_RESOLVERS[name] = []
122
+ for (const wake of waiters) wake()
123
+ }
68
124
  }
69
125
 
70
126
  export const createAdapter = (config) => {
@@ -86,8 +142,16 @@ export const resolveDb = async (config) => {
86
142
 
87
143
  // Custom registrations win over built-ins — a consumer that
88
144
  // registerAdapter('supabase', myCustom) gets to shadow the built-in.
89
- const loader = CUSTOM_ADAPTERS[name] || BUILTIN_ADAPTERS[name]
90
- if (!loader) throw new Error(`Unknown db adapter: "${name}". Use registerAdapter() for adapters with optional deps.`)
145
+ let loader = CUSTOM_ADAPTERS[name] || BUILTIN_ADAPTERS[name]
146
+ if (!loader) {
147
+ // Not registered YET. A custom adapter's registerAdapter() can land a
148
+ // tick after an early element's create() fires resolveDb (boot-time
149
+ // race — the workspace's 'sdk' adapter is the canonical case). Wait
150
+ // briefly for it before failing; built-ins resolve synchronously above,
151
+ // so only a genuinely-unknown name reaches the timeout and throws.
152
+ loader = await _waitForCustomAdapter(name)
153
+ if (!loader) throw new Error(`Unknown db adapter: "${name}". Use registerAdapter() for adapters with optional deps.`)
154
+ }
91
155
 
92
156
  const mod = await loader()
93
157
  if (!mod || typeof mod.setup !== 'function') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symbo.ls/fetch",
3
- "version": "3.14.105",
3
+ "version": "3.14.285",
4
4
  "license": "CC-BY-NC-4.0",
5
5
  "type": "module",
6
6
  "module": "./dist/esm/index.js",
@@ -44,7 +44,7 @@
44
44
  "@symbo.ls/utils": "^3.14.105"
45
45
  },
46
46
  "peerDependencies": {
47
- "@supabase/supabase-js": "^2.0.0"
47
+ "@supabase/supabase-js": "^2.108.0"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@supabase/supabase-js": {