@symbo.ls/fetch 3.14.664 → 3.14.665

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,5 +1,24 @@
1
1
  # @symbo.ls/fetch
2
2
 
3
+ ## 3.14.665
4
+
5
+ ### Patch Changes
6
+
7
+ - xma.info report round (FW-XMA-EXCEPTIONS-UPSTREAM-1), its /simplify pass and the follow-ups.
8
+
9
+ - element: optional features (view events, `always` handler chains, plain-row diff, hydration, yielding mount) are feature slots — `create.js` installs all of them, `src/lean.js` none (the smbls embed); one chunked mount driver and one meter per task; the chunked first render costs about a third of what it did (a resumed row goes after the previous row, one `__ref` shape, the budget is read once); `whenConnected`; `onWindowLoad` after load reaches an element built off-document; a null/false row item under `childExtends` builds nothing; building an n-row list no longer scans the parent's keys per row.
10
+ - smbls: the embed is back under its 72 KiB cap and the iife is 2.6 % smaller (terser renames locals after esbuild in the two classic-script builds; maps chained); kits stay lazy in `smbls/core`, fetch is one chunk; live sync loads only when `wantsLiveSync`; a URL-loaded dependency registers in parcel builds.
11
+ - router: the newest navigation wins over one waiting on an async guard; no lazy chunk rides along a resumed route.
12
+ - default-config: accessible Dropdown writes its attributes straight to the nodes, one tab stop per list, an `active` write re-runs only the rows that change, a key-opened menu focuses its item during the reveal; Dialog and Icon clean-ups.
13
+ - styling (scratch, css, css-in-props): one compound-value resolver; CSS colour functions (`oklch()`, `color()`, `color-mix()`, `light-dark()`, `lab()`, `lch()`, `hwb()`) pass through compound values; border props read the scheme only in literal mode.
14
+ - fetch / brender: every server render starts from an empty query cache (seeds carry every request a page makes); the local adapter stays lazy; shared route loop for `smbls build` and `smbls brender`, `smbls brender --strict`.
15
+ - cli: every command that writes to the platform prints its target and needs a typed "production" or `--yes` for production; `smbls deploy --save` saves the provider, `-y/--yes` is consent; `deploy --dry-run` no longer pushes.
16
+ - frank-audit: FA205 reports only factory calls that run at module load.
17
+
18
+ - Updated dependencies
19
+ - @symbo.ls/signal@3.14.789
20
+ - @symbo.ls/utils@3.14.787
21
+
3
22
  ## 3.14.664
4
23
 
5
24
  ### Patch Changes
package/README.md CHANGED
@@ -30,6 +30,8 @@ fetch: { adapter: 'sdk', sdk: getSDK() }
30
30
 
31
31
  > `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(...)`, …).
32
32
 
33
+ The REST adapter ships inside the plugin. The local adapter is a file of its own: an app loads it only when its config names `adapter: 'local'`.
34
+
33
35
  ## Declarative `fetch`
34
36
 
35
37
  ```js
@@ -739,7 +741,22 @@ A request is the adapter call it stands for: `{ method: 'select' | 'rpc', from,
739
741
 
740
742
  Early GETs skip the HTTP cache (`cache: 'no-store'`) unless the adapter's `fetchOptions.cache` says otherwise; they copy `credentials`, `mode`, `redirect`, `referrerPolicy` and `priority` from `fetchOptions`.
741
743
 
742
- **Build.** `smbls build` (and `smbls deploy` to Cloudflare or Netlify) writes the script next to the built page as `early.<hash>.js` and references it first thing in `<head>` — `<script async data-symbols-early src="…">`. A file, not an inline script, so a Content-Security-Policy without `'unsafe-inline'` allows it. Without `fetch.early` the build output is unchanged. Other build paths can generate the script with `createEarlyScript({ fetch, polyglot, state })` from `@symbo.ls/fetch/early-script`. The script never runs on the server (brender), and an adapter without `early` never looks for its answers.
744
+ **Build.** `smbls build` (and `smbls deploy` to Cloudflare or Netlify) writes the script next to the built page as `early.<hash>.js` and references it first thing in `<head>` — `<script async data-symbols-early src="…">`. A file, not an inline script, so a Content-Security-Policy without `'unsafe-inline'` allows it. The optimized page counts as written: unquoted attributes (`<script type=module src=/index.1a2b.js>`) and a dropped optional `<head>` tag (the script then opens the implied head, right after `<html>`). When `fetch.early` is set and nothing could be added — no app script on the page, or no request the script can make (it needs the REST adapter, `url`, and `always` or `routes`) — the build says why (`Early data requests not added: …`) and still succeeds. Without `fetch.early` the build output is unchanged. Other build paths can generate the script with `createEarlyScript({ fetch, polyglot, state })` from `@symbo.ls/fetch/early-script`. The script never runs on the server (brender), and an adapter without `early` never looks for its answers.
745
+
746
+ ## Server-seeded answers (brender)
747
+
748
+ A page pre-rendered by `@symbo.ls/brender` carries the answers its render got, so the client does not ask for them again: a JSON data block after the markup (no Content-Security-Policy blocks one).
749
+
750
+ ```html
751
+ <script type="application/json" data-fetch-seed>[{"k":"<earlyKey>","s":200,"t":"application/json","b":"[…]"}]</script>
752
+ ```
753
+
754
+ - **Recorded on the server:** a GET whose only headers are `Accept` / `Accept-Language` — an anonymous read; with `reads` its configured key travels in the query string, so a keyed backend's reads (Supabase) count, and read-only RPCs (`reads.rpc: 'get'`, `read: true`) too — with an ok JSON or text answer. Never a POST, a call with `Authorization` or another header.
755
+ - **Read on the client:** the REST adapter reads the block when it opens (the block goes once read). A call takes a seeded answer when it sends exactly the recorded request: the same URL (query included) and `Accept-Language`, no other header. Each answer is taken once, within 30 s, and read without a `Response` — its data lands in the task the app booted in. Without `fetch.early` too.
756
+ - **Build side:** `createEarlySeedBlock(entries)` (`entries`: `[{ url, lang, status, type, body }]`); `createEarlySeedScript(entries)` is the older inline form.
757
+ - **One query cache per render:** a context with `isolateFetchCache: true` (brender sets it on every render) starts from an empty cache. Its first query drops what an earlier render left: the cached rows, the requests still out (never shared with it, never written back as fresh) and the mounted queries. So a page rendered after another one that read the same key makes its own request, and its seed carries the answer its markup shows. A browser context never sets it; the cache works as described above.
758
+
759
+ `requestsInFlight()` and `whenRequestsIdle()` (from `@symbo.ls/fetch`) count the REST adapter's requests from the call until the body is read — `smbls` holds the hydration window over a pre-rendered page open until the first view's requests are done.
743
760
 
744
761
  ## Auth guard
745
762
 
package/adapters/rest.js CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  import { openEarly, takeEarly, earlyKey, isScalarParams, withReads, queryHeaderEntries } from '../early.js'
4
+ import { requestStarted, requestFinished } from '../inflight.js'
4
5
 
5
6
  // `buildUrl` and `selectQuery` are the address of a GET. The pre-boot script
6
7
  // of `fetch.early` (earlyScript.js) embeds both BY SOURCE, so an early request
@@ -91,16 +92,52 @@ const readErrorBody = async (res) => {
91
92
  // read as a success.
92
93
  const errorMessage = (body, res) => body?.message || body?.error || res.statusText || `HTTP ${res.status}`
93
94
 
95
+ // A server-seeded answer (early.js takeEarly) read without a Response — the
96
+ // readers that need nothing but the body text. null for any other type (the
97
+ // caller builds a Response from it); false for a JSON body that does not
98
+ // parse (the caller asks the network instead).
99
+ const readSeeded = (answer, type) => {
100
+ const body = answer.body
101
+ const json = type === 'json' || (type === 'auto' && /json/i.test(answer.type))
102
+ if (!json && type !== 'auto' && type !== 'text') return null
103
+ let data
104
+ try {
105
+ data = json ? (body ? JSON.parse(body) : null) : body
106
+ } catch (e) {
107
+ return false
108
+ }
109
+ return { data, error: null, status: answer.status }
110
+ }
111
+
94
112
  const request = async (url, options, responseType, early) => {
95
113
  const type = responseType == null ? 'auto' : responseType
96
114
  if (!RESPONSE_TYPES.includes(type)) {
97
115
  throw new TypeError(`@symbo.ls/fetch rest: unknown responseType "${type}" — use one of: ${RESPONSE_TYPES.join(', ')}`)
98
116
  }
117
+ // Counted until the body is read (../inflight.js): smbls's hydration window
118
+ // waits for the first view's requests.
119
+ requestStarted()
120
+ try {
121
+ return await send(url, options, type, early)
122
+ } finally {
123
+ requestFinished()
124
+ }
125
+ }
99
126
 
100
- // `early` — the pre-boot script's answer to this very request (fetch.early),
101
- // read exactly like the adapter's own; when that GET failed or was refused,
102
- // the request is sent as usual.
103
- const res = (early && await early) || await globalThis.fetch(url, options)
127
+ const send = async (url, options, type, early) => {
128
+ // `early` — an answer to this very request that is already here: the
129
+ // pre-boot script's (fetch.early) or the server's (a brender seed), read
130
+ // exactly like the adapter's own; when that GET failed or was refused, the
131
+ // request is sent as usual.
132
+ let answer = early ? await early : null
133
+ if (answer && answer.seeded === true) {
134
+ const read = readSeeded(answer, type)
135
+ if (read) return read
136
+ answer = read === false
137
+ ? null
138
+ : new Response(answer.body, { status: answer.status, headers: { 'content-type': answer.type } })
139
+ }
140
+ const res = answer || await globalThis.fetch(url, options)
104
141
 
105
142
  if (type === 'auto') {
106
143
  const data = await readAuto(res)
@@ -278,6 +315,30 @@ export const restAdapter = (baseUrl, defaultHeaders = {}, authConfig, defaultFet
278
315
  }
279
316
  }
280
317
 
318
+ // The server's recorded answer to this call (a brender seed), if one waits
319
+ // for the request exactly as it goes out: its URL — an anonymous read's
320
+ // key moved into the query included (`reads.query`) — and language, and no
321
+ // header beyond Accept-Language and Accept, which is all the server records
322
+ // (an anonymous GET). Looked up before the pre-boot script's answer: it is
323
+ // already here, and it is what the page on screen was rendered from. The
324
+ // seed recorded such a read under its sent URL, and `adopt` keys by the
325
+ // address without the moved key and wants it in `carried`, so a Supabase
326
+ // project's reads were never adopted (XMA report, brender items 3 and 15).
327
+ const adoptSeeded = (sentUrl, headers) => {
328
+ if (!early || !early.seeded) return null
329
+ let lang = ''
330
+ for (const name in headers) {
331
+ const lower = name.toLowerCase()
332
+ if (lower === 'accept-language') lang = String(headers[name])
333
+ else if (lower !== 'accept') return null
334
+ }
335
+ try {
336
+ return takeEarly(earlyKey(sentUrl, lang), early.maxAge)
337
+ } catch (e) {
338
+ return null
339
+ }
340
+ }
341
+
281
342
  // Precedence, lowest first: the configured headers, the adapter's token, the
282
343
  // body's Content-Type, then the call's own `headers` — so one call can send
283
344
  // its own Bearer token (a per-user token) or its own Content-Type.
@@ -359,10 +420,11 @@ export const restAdapter = (baseUrl, defaultHeaders = {}, authConfig, defaultFet
359
420
  const anonymous = anonymousRead(merged)
360
421
  if (anonymous) {
361
422
  const options = getFetchOptions({ headers: anonymous.headers })
362
- return request(withQuery(url, anonymous.query), options, responseType, adopt(() => url, anonymous.adoptHeaders))
423
+ const sent = withQuery(url, anonymous.query)
424
+ return request(sent, options, responseType, adoptSeeded(sent, anonymous.headers) || adopt(() => url, anonymous.adoptHeaders))
363
425
  }
364
426
  const options = getFetchOptions({ headers: merged })
365
- return request(url, options, responseType, adopt(() => url, options.headers))
427
+ return request(url, options, responseType, adoptSeeded(url, options.headers) || adopt(() => url, options.headers))
366
428
  },
367
429
 
368
430
  // An RPC is a POST. With `reads.rpc: 'get'` an anonymous call marked
@@ -385,7 +447,8 @@ export const restAdapter = (baseUrl, defaultHeaders = {}, authConfig, defaultFet
385
447
  if (!url) return post(early && early.rpc && scalar ? adopt(address, merged) : null)
386
448
 
387
449
  const options = getFetchOptions({ method: 'GET', headers: anonymous.headers })
388
- const result = await request(withQuery(url, anonymous.query), options, responseType, adopt(() => url, anonymous.adoptHeaders))
450
+ const sent = withQuery(url, anonymous.query)
451
+ const result = await request(sent, options, responseType, adoptSeeded(sent, anonymous.headers) || adopt(() => url, anonymous.adoptHeaders))
389
452
  // 405: the backend serves this function only as a POST (PostgREST runs
390
453
  // a GET read-only and refuses a VOLATILE function that writes with 405
391
454
  // before anything was written) — the call's own POST decides.
@@ -1 +1 @@
1
- "use strict";var B=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var M=(t,e)=>{for(var r in e)B(t,r,{get:e[r],enumerable:!0})},Q=(t,e,r,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of G(e))!z.call(t,s)&&s!==r&&B(t,s,{get:()=>e[s],enumerable:!(l=F(e,s))||l.enumerable});return t};var K=t=>Q(B({},"__esModule",{value:!0}),t);var ot={};M(ot,{buildUrl:()=>H,headerEntries:()=>Y,restAdapter:()=>D,selectQuery:()=>W,setup:()=>st,withQuery:()=>L});module.exports=K(ot);var f=require("../early.js");const H=(t,e,r)=>{const l=e&&!e.startsWith("/")?"/":"",s=new URL(`${t}${l}${e}`);if(r)for(const c in r){const o=r[c];o!=null&&s.searchParams.set(c,typeof o=="object"?JSON.stringify(o):o)}return s.toString()},W=({params:t,select:e,limit:r,offset:l,order:s,single:c})=>{const o={...t};return e&&(o.select=e),r&&(o.limit=r),l&&(o.offset=l),c&&(o.single=!0),s&&(typeof s=="string"?o.order=s:Array.isArray(s)?o.order=s.map(T=>`${T.by}:${T.asc===!1?"desc":"asc"}`).join(","):s.by&&(o.order=`${s.by}:${s.asc===!1?"desc":"asc"}`)),o},q=t=>Object.prototype.toString.call(t).slice(8,-1),J=["auto","json","text","blob","arrayBuffer","stream","response"],V={json:async t=>{const e=await t.text();return e?JSON.parse(e):null},text:t=>t.text(),blob:t=>t.blob(),arrayBuffer:t=>t.arrayBuffer(),stream:t=>t.body,response:t=>t},v=t=>{const e=t.headers.get("content-type");return e&&e.includes("json")?t.json():t.text()},X=async t=>{const e=await t.text(),r=t.headers.get("content-type");if(e&&r&&r.includes("json"))try{return JSON.parse(e)}catch{}return e},I=(t,e)=>t?.message||t?.error||e.statusText||`HTTP ${e.status}`,h=async(t,e,r,l)=>{const s=r??"auto";if(!J.includes(s))throw new TypeError(`@symbo.ls/fetch rest: unknown responseType "${s}" \u2014 use one of: ${J.join(", ")}`);const c=l&&await l||await globalThis.fetch(t,e);if(s==="auto"){const o=await v(c);return{data:o,error:c.ok?null:I(o,c),status:c.status}}if(!c.ok){const o=await X(s==="response"?c.clone():c);return{data:s==="response"?c:o,error:I(o,c),status:c.status}}return{data:await V[s](c),error:null,status:c.status}},Z=["FormData","Blob","File","URLSearchParams","ReadableStream","ArrayBuffer"],C=t=>t!==null&&typeof t=="object"&&(ArrayBuffer.isView(t)||Z.includes(q(t))),Y=t=>Array.isArray(t)?t:typeof t.entries=="function"?t.entries():Object.entries(t),N=(...t)=>{const e={},r=new Map;for(const l of t)if(l)for(const[s,c]of Y(l)){const o=s.toLowerCase();if(r.has(o)&&delete e[r.get(o)],c==null){r.delete(o);continue}r.set(o,s),e[s]=c}return e},tt={"Content-Type":"application/json"},et={"Content-Type":void 0},nt=t=>{if(!t||typeof t!="object")return null;const e={};for(const{header:r,param:l}of(0,f.queryHeaderEntries)(t.query))e[r]=l;return{params:e,rpc:t.rpc==="get"}},rt="content-type",L=(t,e)=>{const r=Object.keys(e);if(!r.length)return t;const l=new URL(t);for(const s of r)l.searchParams.set(s,e[s]);return l.toString()},st=async({url:t,headers:e,auth:r,fetchOptions:l,early:s,reads:c})=>{if(!t)throw new Error("@symbo.ls/fetch rest: url is required");return D(t,e,r,l,s,c)},D=(t,e={},r,l={},s,c)=>{let o=r?.token||null;const T=(0,f.openEarly)((0,f.withReads)(s,c),e),j=nt(c),_=n=>{if(!j)return null;const a={},u={},i={};for(const d in n){const p=d.toLowerCase();if(p==="authorization")return null;if(p===rt)continue;u[d]=n[d];const y=j.params[p];y?i[y]=n[d]:a[d]=n[d]}return{headers:a,adoptHeaders:u,query:i}},A=(n,a)=>{if(!T)return null;let u="";for(const i in a){const d=i.toLowerCase();if(d==="accept-language")u=String(a[i]);else if(T.carried[d]!==a[i])return null}try{return(0,f.takeEarly)((0,f.earlyKey)(n(),u),T.maxAge)}catch{return null}},R=()=>o?{Authorization:`Bearer ${o}`}:null,U=n=>N(e,R(),n),S=n=>({...l,...n}),P=(n,a,u)=>{if(!C(a))return S({method:n,headers:N(e,R(),tt,u),body:JSON.stringify(a)});const i={method:n,headers:N(e,R(),et,u),body:a};return q(a)==="ReadableStream"&&(i.duplex="half"),S(i)},$=(n,a)=>{const u=a||t;if(n&&(n.startsWith("http://")||n.startsWith("https://")))return n;const i=n&&!n.startsWith("/")?"/":"";return`${u}${i}${n||""}`};return{name:"rest",setToken:n=>{o=n},getSession:async()=>{if(!r?.sessionUrl)return o?{token:o}:null;const n=await h($(r.sessionUrl,r.baseUrl),S({headers:U()}));return n.error?null:n.data},signIn:async n=>{if(!r?.signInUrl)throw new Error("rest: auth.signInUrl not configured");const a=await h($(r.signInUrl,r.baseUrl),P("POST",n));return a.data?.token&&(o=a.data.token),a},signOut:async()=>(r?.signOutUrl&&await h($(r.signOutUrl,r.baseUrl),S({method:"POST",headers:U()})),o=null,{error:null}),select:({from:n,params:a,select:u,limit:i,offset:d,order:p,single:y,headers:w,baseUrl:g,responseType:m})=>{const b=H(g||t,n||"",W({params:a,select:u,limit:i,offset:d,order:p,single:y})),E=U(w),O=_(E);if(O){const k=S({headers:O.headers});return h(L(b,O.query),k,m,A(()=>b,O.adoptHeaders))}const x=S({headers:E});return h(b,x,m,A(()=>b,x.headers))},rpc:async({from:n,params:a,headers:u,baseUrl:i,responseType:d,read:p})=>{const y=(0,f.isScalarParams)(a),w=()=>H(i||t,`rpc/${n}`,a),g=k=>h($(`rpc/${n}`,i),P("POST",a,u),d,k),m=U(u),b=p===!0&&j&&j.rpc&&y?_(m):null;let E=null;if(b)try{E=w()}catch{E=null}if(!E)return g(T&&T.rpc&&y?A(w,m):null);const O=S({method:"GET",headers:b.headers}),x=await h(L(E,b.query),O,d,A(()=>E,b.adoptHeaders));return x.status===405?g(null):x},insert:({from:n,data:a,headers:u,baseUrl:i,responseType:d})=>h($(n,i),P("POST",a,u),d),update:({from:n,data:a,params:u,method:i,headers:d,baseUrl:p,responseType:y})=>{const w=u?.id||a?.id,g=w?`${n}/${w}`:n;return h($(g,p),P(i||"PATCH",a,d),y)},upsert:({from:n,data:a,params:u,method:i,headers:d,baseUrl:p,responseType:y})=>{const w=u?.id||a?.id,g=w?`${n}/${w}`:n;return h($(g,p),P(i||"PUT",a,d),y)},delete:({from:n,params:a,headers:u,baseUrl:i,responseType:d})=>{const p=a?.id,y=p?`${n}/${p}`:n;return h($(y,i),S({method:"DELETE",headers:U(u)}),d)}}};
1
+ "use strict";var H=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var V=(t,e)=>{for(var n in e)H(t,n,{get:e[n],enumerable:!0})},v=(t,e,n,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Q(e))!K.call(t,s)&&s!==n&&H(t,s,{get:()=>e[s],enumerable:!(l=M(e,s))||l.enumerable});return t};var X=t=>v(H({},"__esModule",{value:!0}),t);var it={};V(it,{buildUrl:()=>_,headerEntries:()=>G,restAdapter:()=>z,selectQuery:()=>D,setup:()=>ut,withQuery:()=>J});module.exports=X(it);var f=require("../early.js"),N=require("../inflight.js");const _=(t,e,n)=>{const l=e&&!e.startsWith("/")?"/":"",s=new URL(`${t}${l}${e}`);if(n)for(const u in n){const o=n[u];o!=null&&s.searchParams.set(u,typeof o=="object"?JSON.stringify(o):o)}return s.toString()},D=({params:t,select:e,limit:n,offset:l,order:s,single:u})=>{const o={...t};return e&&(o.select=e),n&&(o.limit=n),l&&(o.offset=l),u&&(o.single=!0),s&&(typeof s=="string"?o.order=s:Array.isArray(s)?o.order=s.map(h=>`${h.by}:${h.asc===!1?"desc":"asc"}`).join(","):s.by&&(o.order=`${s.by}:${s.asc===!1?"desc":"asc"}`)),o},I=t=>Object.prototype.toString.call(t).slice(8,-1),W=["auto","json","text","blob","arrayBuffer","stream","response"],Z={json:async t=>{const e=await t.text();return e?JSON.parse(e):null},text:t=>t.text(),blob:t=>t.blob(),arrayBuffer:t=>t.arrayBuffer(),stream:t=>t.body,response:t=>t},C=t=>{const e=t.headers.get("content-type");return e&&e.includes("json")?t.json():t.text()},tt=async t=>{const e=await t.text(),n=t.headers.get("content-type");if(e&&n&&n.includes("json"))try{return JSON.parse(e)}catch{}return e},Y=(t,e)=>t?.message||t?.error||e.statusText||`HTTP ${e.status}`,et=(t,e)=>{const n=t.body,l=e==="json"||e==="auto"&&/json/i.test(t.type);if(!l&&e!=="auto"&&e!=="text")return null;let s;try{s=l?n?JSON.parse(n):null:n}catch{return!1}return{data:s,error:null,status:t.status}},b=async(t,e,n,l)=>{const s=n??"auto";if(!W.includes(s))throw new TypeError(`@symbo.ls/fetch rest: unknown responseType "${s}" \u2014 use one of: ${W.join(", ")}`);(0,N.requestStarted)();try{return await nt(t,e,s,l)}finally{(0,N.requestFinished)()}},nt=async(t,e,n,l)=>{let s=l?await l:null;if(s&&s.seeded===!0){const o=et(s,n);if(o)return o;s=o===!1?null:new Response(s.body,{status:s.status,headers:{"content-type":s.type}})}const u=s||await globalThis.fetch(t,e);if(n==="auto"){const o=await C(u);return{data:o,error:u.ok?null:Y(o,u),status:u.status}}if(!u.ok){const o=await tt(n==="response"?u.clone():u);return{data:n==="response"?u:o,error:Y(o,u),status:u.status}}return{data:await Z[n](u),error:null,status:u.status}},rt=["FormData","Blob","File","URLSearchParams","ReadableStream","ArrayBuffer"],st=t=>t!==null&&typeof t=="object"&&(ArrayBuffer.isView(t)||rt.includes(I(t))),G=t=>Array.isArray(t)?t:typeof t.entries=="function"?t.entries():Object.entries(t),L=(...t)=>{const e={},n=new Map;for(const l of t)if(l)for(const[s,u]of G(l)){const o=s.toLowerCase();if(n.has(o)&&delete e[n.get(o)],u==null){n.delete(o);continue}n.set(o,s),e[s]=u}return e},ot={"Content-Type":"application/json"},at={"Content-Type":void 0},ct=t=>{if(!t||typeof t!="object")return null;const e={};for(const{header:n,param:l}of(0,f.queryHeaderEntries)(t.query))e[n]=l;return{params:e,rpc:t.rpc==="get"}},lt="content-type",J=(t,e)=>{const n=Object.keys(e);if(!n.length)return t;const l=new URL(t);for(const s of n)l.searchParams.set(s,e[s]);return l.toString()},ut=async({url:t,headers:e,auth:n,fetchOptions:l,early:s,reads:u})=>{if(!t)throw new Error("@symbo.ls/fetch rest: url is required");return z(t,e,n,l,s,u)},z=(t,e={},n,l={},s,u)=>{let o=n?.token||null;const h=(0,f.openEarly)((0,f.withReads)(s,u),e),A=ct(u),F=r=>{if(!A)return null;const a={},i={},c={};for(const d in r){const p=d.toLowerCase();if(p==="authorization")return null;if(p===lt)continue;i[d]=r[d];const y=A.params[p];y?c[y]=r[d]:a[d]=r[d]}return{headers:a,adoptHeaders:i,query:c}},k=(r,a)=>{if(!h)return null;let i="";for(const c in a){const d=c.toLowerCase();if(d==="accept-language")i=String(a[c]);else if(h.carried[d]!==a[c])return null}try{return(0,f.takeEarly)((0,f.earlyKey)(r(),i),h.maxAge)}catch{return null}},B=(r,a)=>{if(!h||!h.seeded)return null;let i="";for(const c in a){const d=c.toLowerCase();if(d==="accept-language")i=String(a[c]);else if(d!=="accept")return null}try{return(0,f.takeEarly)((0,f.earlyKey)(r,i),h.maxAge)}catch{return null}},q=()=>o?{Authorization:`Bearer ${o}`}:null,m=r=>L(e,q(),r),g=r=>({...l,...r}),P=(r,a,i)=>{if(!st(a))return g({method:r,headers:L(e,q(),ot,i),body:JSON.stringify(a)});const c={method:r,headers:L(e,q(),at,i),body:a};return I(a)==="ReadableStream"&&(c.duplex="half"),g(c)},T=(r,a)=>{const i=a||t;if(r&&(r.startsWith("http://")||r.startsWith("https://")))return r;const c=r&&!r.startsWith("/")?"/":"";return`${i}${c}${r||""}`};return{name:"rest",setToken:r=>{o=r},getSession:async()=>{if(!n?.sessionUrl)return o?{token:o}:null;const r=await b(T(n.sessionUrl,n.baseUrl),g({headers:m()}));return r.error?null:r.data},signIn:async r=>{if(!n?.signInUrl)throw new Error("rest: auth.signInUrl not configured");const a=await b(T(n.signInUrl,n.baseUrl),P("POST",r));return a.data?.token&&(o=a.data.token),a},signOut:async()=>(n?.signOutUrl&&await b(T(n.signOutUrl,n.baseUrl),g({method:"POST",headers:m()})),o=null,{error:null}),select:({from:r,params:a,select:i,limit:c,offset:d,order:p,single:y,headers:S,baseUrl:O,responseType:x})=>{const w=_(O||t,r||"",D({params:a,select:i,limit:c,offset:d,order:p,single:y})),$=m(S),E=F($);if(E){const R=g({headers:E.headers}),j=J(w,E.query);return b(j,R,x,B(j,E.headers)||k(()=>w,E.adoptHeaders))}const U=g({headers:$});return b(w,U,x,B(w,U.headers)||k(()=>w,U.headers))},rpc:async({from:r,params:a,headers:i,baseUrl:c,responseType:d,read:p})=>{const y=(0,f.isScalarParams)(a),S=()=>_(c||t,`rpc/${r}`,a),O=j=>b(T(`rpc/${r}`,c),P("POST",a,i),d,j),x=m(i),w=p===!0&&A&&A.rpc&&y?F(x):null;let $=null;if(w)try{$=S()}catch{$=null}if(!$)return O(h&&h.rpc&&y?k(S,x):null);const E=g({method:"GET",headers:w.headers}),U=J($,w.query),R=await b(U,E,d,B(U,w.headers)||k(()=>$,w.adoptHeaders));return R.status===405?O(null):R},insert:({from:r,data:a,headers:i,baseUrl:c,responseType:d})=>b(T(r,c),P("POST",a,i),d),update:({from:r,data:a,params:i,method:c,headers:d,baseUrl:p,responseType:y})=>{const S=i?.id||a?.id,O=S?`${r}/${S}`:r;return b(T(O,p),P(c||"PATCH",a,d),y)},upsert:({from:r,data:a,params:i,method:c,headers:d,baseUrl:p,responseType:y})=>{const S=i?.id||a?.id,O=S?`${r}/${S}`:r;return b(T(O,p),P(c||"PUT",a,d),y)},delete:({from:r,params:a,headers:i,baseUrl:c,responseType:d})=>{const p=a?.id,y=p?`${r}/${p}`:r;return b(T(y,c),g({method:"DELETE",headers:m(i)}),d)}}};
package/dist/cjs/early.js CHANGED
@@ -1 +1 @@
1
- "use strict";var y=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var w=(e,r)=>{for(var n in r)y(e,n,{get:r[n],enumerable:!0})},j=(e,r,n,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of k(r))!E.call(e,o)&&o!==n&&y(e,o,{get:()=>r[o],enumerable:!(t=A(r,o))||t.enumerable});return e};var v=e=>j(y({},"__esModule",{value:!0}),e);var Y={};w(Y,{EARLY_KEY:()=>b,EARLY_MAX_AGE:()=>a,createEarlySeedScript:()=>O,dropEarly:()=>P,earlyKey:()=>m,isScalarParams:()=>S,matchEarlyRoute:()=>R,openEarly:()=>q,queryHeaderEntries:()=>x,takeEarly:()=>L,withReads:()=>T});module.exports=v(Y);var h=require("@symbo.ls/utils");const b="@symbo.ls/fetch:EARLY",a=3e4,m=(e,r)=>{const n=new URL(e);return n.searchParams.sort(),n.toString()+" "+(r||"")},S=e=>{if(e==null)return!0;if(typeof e!="object"||Array.isArray(e))return!1;const r=Object.getPrototypeOf(e);if(r!==Object.prototype&&r!==null)return!1;for(const n in e){const t=e[n];if(!(t===void 0||typeof t=="string"||typeof t=="boolean")&&!(typeof t=="number"&&isFinite(t)))return!1}return!0},R=(e,r)=>{const n=s=>String(s).split("/").filter(Boolean),t=n(r);let o=null;for(let s=0;s<e.length;s++){const i=n(e[s]),c=i[i.length-1]==="*",f=c?i.length-1:i.length;if(c?t.length<f:t.length!==f)continue;const g={};let u=c?-1:0,p=!0;for(let l=0;l<f;l++)if(i[l].charAt(0)===":"){try{g[i[l].slice(1)]=decodeURIComponent(t[l])}catch{p=!1;break}u+=1}else if(i[l]===t[l])u+=3;else{p=!1;break}p&&(!o||u>o.score)&&(o={index:s,params:g,score:u})}return o&&{index:o.index,params:o.params}},d=()=>Symbol.for(b),x=(e,r)=>{const n=[];for(const t in e||{}){const o=t.toLowerCase(),s={name:t,header:o,param:e[t],found:!1,value:void 0};for(const i in r||{})i.toLowerCase()===o&&(s.found=!0,s.value=r[i]);n.push(s)}return n},T=(e,r)=>{if(!e||typeof e!="object"||!r||typeof r!="object")return e;const n={...e};return n.query===void 0&&r.query!==void 0&&(n.query=r.query),n.rpc===void 0&&r.rpc!==void 0&&(n.rpc=r.rpc),n},q=(e,r)=>{const n=d();if(!e||typeof e!="object"){const s=globalThis[n];return s&&s.seeded?{carried:{},rpc:!1,maxAge:a}:null}globalThis[n]||(globalThis[n]={entries:{}});const t={};for(const{header:s,found:i,value:c}of x(e.query,r))i&&(t[s]=c);const o=typeof e.maxAge=="number"&&e.maxAge>=0?e.maxAge:a;return{carried:t,rpc:e.rpc==="get",maxAge:o}},L=(e,r=a)=>{const n=globalThis[d()],t=n&&n.entries&&n.entries[e];return!t||(delete n.entries[e],!(Date.now()-t.time<=r))?null:Promise.resolve(t.answer).then(o=>o&&o.ok&&!o.bodyUsed?o:null,()=>null)},P=()=>{const e=globalThis[d()];e&&e.entries&&(e.entries={})},O=e=>{const r=(Array.isArray(e)?e:[]).filter(t=>t&&typeof t.url=="string"&&typeof t.body=="string");if(!r.length)return"";const n=(0,h.jsonForScript)(r.map(t=>({k:m(t.url,t.lang||""),s:t.status||200,t:t.type||"application/json",b:t.body})));return"<script>(function(){try{var k=Symbol.for("+JSON.stringify(b)+"),r=globalThis[k]||(globalThis[k]={entries:{}}),t=Date.now(),l="+n+';r.seeded=true;r.entries=r.entries||{};for(var i=0;i<l.length;i++){var e=l[i];r.entries[e.k]={time:t,answer:Promise.resolve(new Response(e.b,{status:e.s,headers:{"content-type":e.t}}))}}}catch(e){}})()<\/script>'};
1
+ "use strict";var g=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var w=(e,t)=>{for(var r in t)g(e,r,{get:t[r],enumerable:!0})},T=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of v(t))!S.call(e,o)&&o!==r&&g(e,o,{get:()=>t[o],enumerable:!(n=j(t,o))||n.enumerable});return e};var L=e=>T(g({},"__esModule",{value:!0}),e);var Y={};w(Y,{EARLY_KEY:()=>h,EARLY_MAX_AGE:()=>d,SEED_BLOCK:()=>A,createEarlySeedBlock:()=>C,createEarlySeedScript:()=>K,dropEarly:()=>O,earlyKey:()=>x,isScalarParams:()=>R,matchEarlyRoute:()=>q,openEarly:()=>B,queryHeaderEntries:()=>k,readSeedBlock:()=>E,takeEarly:()=>D,withReads:()=>P});module.exports=L(Y);var a=require("@symbo.ls/utils");const h="@symbo.ls/fetch:EARLY",d=3e4,x=(e,t)=>{const r=new URL(e);return r.searchParams.sort(),r.toString()+" "+(t||"")},R=e=>{if(e==null)return!0;if(typeof e!="object"||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);if(t!==Object.prototype&&t!==null)return!1;for(const r in e){const n=e[r];if(!(n===void 0||typeof n=="string"||typeof n=="boolean")&&!(typeof n=="number"&&isFinite(n)))return!1}return!0},q=(e,t)=>{const r=s=>String(s).split("/").filter(Boolean),n=r(t);let o=null;for(let s=0;s<e.length;s++){const i=r(e[s]),c=i[i.length-1]==="*",p=c?i.length-1:i.length;if(c?n.length<p:n.length!==p)continue;const b={};let u=c?-1:0,y=!0;for(let l=0;l<p;l++)if(i[l].charAt(0)===":"){try{b[i[l].slice(1)]=decodeURIComponent(n[l])}catch{y=!1;break}u+=1}else if(i[l]===n[l])u+=3;else{y=!1;break}y&&(!o||u>o.score)&&(o={index:s,params:b,score:u})}return o&&{index:o.index,params:o.params}},f=()=>Symbol.for(h),k=(e,t)=>{const r=[];for(const n in e||{}){const o=n.toLowerCase(),s={name:n,header:o,param:e[n],found:!1,value:void 0};for(const i in t||{})i.toLowerCase()===o&&(s.found=!0,s.value=t[i]);r.push(s)}return r},P=(e,t)=>{if(!e||typeof e!="object"||!t||typeof t!="object")return e;const r={...e};return r.query===void 0&&t.query!==void 0&&(r.query=t.query),r.rpc===void 0&&t.rpc!==void 0&&(r.rpc=t.rpc),r},B=(e,t)=>{const r=f();if(E(),!e||typeof e!="object"){const s=globalThis[r];return s&&s.seeded?{carried:{},rpc:!1,maxAge:d,seeded:!0}:null}globalThis[r]||(globalThis[r]={entries:{}});const n={};for(const{header:s,found:i,value:c}of k(e.query,t))i&&(n[s]=c);const o=typeof e.maxAge=="number"&&e.maxAge>=0?e.maxAge:d;return{carried:n,rpc:e.rpc==="get",maxAge:o,seeded:!!globalThis[r].seeded}},D=(e,t=d)=>{const r=globalThis[f()],n=r&&r.entries&&r.entries[e];return!n||(delete r.entries[e],!(Date.now()-n.time<=t))?null:n.seeded?Promise.resolve(n.seeded):Promise.resolve(n.answer).then(o=>o&&o.ok&&!o.bodyUsed?o:null,()=>null)},O=()=>{const e=globalThis[f()];e&&e.entries&&(e.entries={})},m=e=>(Array.isArray(e)?e:[]).filter(t=>t&&typeof t.url=="string"&&typeof t.body=="string").map(t=>({k:x(t.url,t.lang||""),s:t.status||200,t:t.type||"application/json",b:t.body})),A='script[type="application/json"][data-fetch-seed]',C=e=>{const t=m(e);return t.length?'<script type="application/json" data-fetch-seed>'+(0,a.jsonForScript)(t)+"<\/script>":""},E=()=>{const e=(0,a.readJsonDataBlock)(globalThis.document,A,{remove:!0}),t=e&&e.value;if(!Array.isArray(t)||!t.length)return;const r=f(),n=globalThis[r]||(globalThis[r]={entries:{}});n.entries||(n.entries={}),n.seeded=!0;const o=Date.now();for(const s of t)!s||typeof s.k!="string"||typeof s.b!="string"||n.entries[s.k]||(n.entries[s.k]={time:o,seeded:{seeded:!0,status:s.s||200,type:s.t||"application/json",body:s.b}})},K=e=>{const t=m(e);if(!t.length)return"";const r=(0,a.jsonForScript)(t);return"<script>(function(){try{var k=Symbol.for("+JSON.stringify(h)+"),r=globalThis[k]||(globalThis[k]={entries:{}}),t=Date.now(),l="+r+';r.seeded=true;r.entries=r.entries||{};for(var i=0;i<l.length;i++){var e=l[i];r.entries[e.k]={time:t,answer:Promise.resolve(new Response(e.b,{status:e.s,headers:{"content-type":e.t}}))}}}catch(e){}})()<\/script>'};
package/dist/cjs/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var bt=Object.create;var he=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var gt=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var mt=(e,t)=>{for(var r in t)he(e,r,{get:t[r],enumerable:!0})},Ve=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of wt(t))!Tt.call(e,o)&&o!==r&&he(e,o,{get:()=>t[o],enumerable:!(s=St(t,o))||s.enumerable});return e};var We=(e,t,r)=>(r=e!=null?bt(gt(e)):{},Ve(t||!e||!e.__esModule?he(r,"default",{value:e,enumerable:!0}):r,e)),vt=e=>Ve(he({},"__esModule",{value:!0}),e);var Bt={};mt(Bt,{EARLY_KEY:()=>Z.EARLY_KEY,createAdapter:()=>Ct,createEarlySeedScript:()=>Z.createEarlySeedScript,default:()=>Yt,earlyKey:()=>Z.earlyKey,executeFetch:()=>Be,fetchFunctions:()=>jt,fetchPlugin:()=>Kt,hasAdapter:()=>At,initAdapterAuth:()=>De,parseDuration:()=>X,queryClient:()=>ae,registerAdapter:()=>Ft,resolveDb:()=>pt});module.exports=vt(Bt);var i=require("@symbo.ls/utils"),lt=require("@symbo.ls/signal"),dt=require("./early.js"),Z=require("./early.js");const Et=["select","rpc","insert","update","upsert","delete","subscribe"],Je={rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},_e=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),J=(()=>{if(typeof globalThis<"u"&&globalThis[_e])return globalThis[_e];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,_e,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[_e]}catch{}return e})(),ye=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),ke=(()=>{if(typeof globalThis<"u"&&globalThis[ye])return globalThis[ye];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ye,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ye]}catch{}return e})(),Dt=5e3,Pt=e=>new Promise(t=>{if(J[e])return t(J[e]);const r=ke[e]||=[];let s=!1;const o=()=>{s||(s=!0,t(J[e]||null))};r.push(o),setTimeout(o,Dt)}),Ft=(e,t)=>{J[e]=t;const r=ke[e];if(r&&r.length){ke[e]=[];for(const s of r)s()}},At=e=>typeof e=="string"&&!!(J[e]||Je[e]),Ct=e=>{const t={};for(const r of Et)e[r]&&(t[r]=e[r]);return t.name=e.name||"custom",t},pt=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...r}=e,s=typeof t=="string"?t:typeof e=="string"?e:null;if(!s)return null;let o=J[s]||Je[s];if(!o&&(o=await Pt(s),!o))throw new Error(`Unknown db adapter: "${s}". Use registerAdapter() for adapters with optional deps.`);const n=await o();if(!n||typeof n.setup!="function")throw new Error(`Adapter "${s}" loader returned a module without a setup() function. Got keys: [${Object.keys(n||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return n.setup(r)},X=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 r=parseInt(t[1]),s=t[2];return s==="ms"?r:s==="s"?r*1e3:s==="m"?r*6e4:s==="h"?r*36e5:0},m=new Map,K=new Map,I=new Map;let be=0;const Se=new Map,Oe=new WeakMap,Le=(e,t,r,s,o=e.page,n=e.cursor)=>{if(e.cache?.key)return e.cache.key;const{from:u,method:c,infinite:a}=e,l=r?`${r}:`:"",h=s?`:${s}`:"",p=o?":p"+JSON.stringify(o):"",v=n!=null?":c"+JSON.stringify(n):"";return`${u}:${c}:${l}${JSON.stringify(t||"")}${a?":infinite":""}${p}${v}${h}`},te=e=>m.get(e)||null,re=(e,t,r,s=++be,o=!1)=>{const n={data:t,error:r,time:Date.now(),stale:o,seq:s};m.set(e,n);const u=K.get(e);if(u)for(const c of u)(0,i.isFunction)(c)&&c(n);return n},we=(e,t)=>{const r=e?m.get(e):null;return r&&!r.error&&r.seq>t?r:null},Re=(e,t)=>(Se.get(e)||0)>t,ge=e=>{Se.set(e,++be)},He=e=>{m.delete(e),ge(e)},xt=(e,t)=>(K.has(e)||K.set(e,new Set),K.get(e).add(t),()=>{const r=K.get(e);r&&(r.delete(t),r.size===0&&K.delete(e))}),Ie=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,i.isString)(e)?{staleTime:X(e),gcTime:3e5}:{staleTime:X(e.stale||e.staleTime)||6e4,gcTime:X(e.gc||e.gcTime||e.expire)||3e5,key:e.key},Y=new Set,Xe=e=>!!e.ref&&e.element.__ref===e.ref,Mt=({config:e,element:t,context:r})=>{try{return Ue(e,t,r)}catch{return null}};let Te=null;const kt=()=>{Te||(Te=setInterval(()=>{const e=Date.now();for(const[t,r]of m){const s=K.get(t);!(s&&s.size>0)&&e-r.time>(r.gcTime||3e5)&&m.delete(t)}for(const[t]of Se)!m.has(t)&&!I.has(t)&&Se.delete(t);for(const t of Y)Xe(t)||Y.delete(t)},3e4),Te.unref&&Te.unref())};kt();const Ze=3,qe=e=>Math.min(1e3*2**e,3e4),et=(e,t)=>{const r=e.retry;return r===void 0&&t?{count:0}:r===!1?{count:0}:r===!0||r===void 0?{count:Ze,delay:qe}:typeof r=="number"?{count:r,delay:qe}:{count:r.count??Ze,delay:(0,i.isFunction)(r.delay)?r.delay:typeof r.delay=="number"?()=>r.delay:qe}},tt=async(e,t)=>{const{count:r,delay:s}=t;let o;for(let n=0;n<=r;n++)try{const u=await e();if(u?.error){if(o=u.error,n<r){const c=(0,i.isFunction)(s)?s(n,o):s;await new Promise(a=>setTimeout(a,c));continue}return u}return u}catch(u){if(o=u,n<r){const c=(0,i.isFunction)(s)?s(n,u):s;await new Promise(a=>setTimeout(a,c));continue}throw u}return{data:null,error:o}},H={focus:new Set,online:new Set};let rt=!1;const Ot=()=>{if(rt||typeof window>"u")return;rt=!0;const e=()=>{for(const r of H.focus)r()},t=()=>{for(const r of H.online)r()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},st=(e,t)=>{const r=t.__ref;if(e===!0)return{from:r.__state||t.key,method:"select",query:!0,on:"create"};if((0,i.isString)(e))return{from:e,method:"select",query:!0,on:"create"};if((0,i.isObject)(e)){const s={...e};return s.from=s.from||r.__state||t.key,s.method=s.method||"select",s.on=s.on||"create",s.query===void 0&&(s.query=!0),s}return null},Lt=["insert","update","upsert","delete"],nt=e=>Lt.includes(e),Ne=e=>e.mutation===!0?!0:e.mutation===!1||e.method!=="rpc"?!1:e.on==="submit"||e.on==="click"||e.invalidates!=null,se=(e,t)=>{const r=e?.state?.root||t?.state?.root;if(r?.lang)return r.lang},me=(e,t)=>{const s=(e?.state?.root||t?.state?.root)?.__fetchScope;return s?String(s):void 0},ve=(e,t,r)=>{let s;if(!e)s=void 0;else if((0,i.isFunction)(e))s=e(t,t.state);else{s={};for(const o in e){const n=e[o];s[o]=(0,i.isFunction)(n)?n(t,t.state):n}}return s},ne=(e,t)=>(0,i.isFunction)(e)?e(t,t.state):e,Ue=(e,t,r)=>Le(e,ve(e.params,t,r),me(t,r),se(t,r),ne(e.page,t),ne(e.cursor,t)),De=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const r=(s,o)=>{const n=t.state?.root;n?.update&&n.update({auth:{user:s,session:o,loading:!1}})};try{const s=await e.getSession();r(s?.user||null,s)}catch(s){console.warn("[fetch] Failed to restore auth session:",s.message)}e.onAuthStateChange&&e.onAuthStateChange((s,o)=>{r(o?.user||null,o)})},Qe=async(e,t)=>{if((0,i.isFunction)(e.select))return e.auth!==!1&&await De(e,t),e;if(e.__resolved)return e.auth!==!1&&await De(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=pt(e);const r=await e.__resolving;return delete e.__resolving,r?(r.auth=e.auth,r.url=e.url,r.key=e.key,e.__resolved=r,t.fetch=r,e.auth!==!1&&await De(r,t),r):null},F=(e,t,...r)=>{const s=(0,i.isFunction)(e[t])?e[t]:null;s&&s.call(e,...r,e,e.state,e.context)},k=(e,t,r,...s)=>{const o=e&&(0,i.isFunction)(e[r])?e[r]:null;o&&o.call(t,...s,t,t.state,t.context)},oe=e=>{const t={},r=e.node;if(!r)return t;if(r.tagName==="FORM"){const o=new FormData(r);for(const[n,u]of o.entries())t[n]=u;return t}const s=r.querySelectorAll("input, textarea, select");for(let o=0;o<s.length;o++){const n=s[o],u=n.name||n.getAttribute("name");u&&(n.type==="checkbox"?t[u]=n.checked:n.type==="file"?t[u]=n.files:t[u]=n.value)}return t},Ee=e=>e.responseType==="stream"||e.responseType==="response",Rt=["Blob","File","ArrayBuffer","ReadableStream","Response"],$e=e=>e!==null&&typeof e=="object"&&(ArrayBuffer.isView(e)||Rt.includes(Object.prototype.toString.call(e).slice(8,-1))),q=(e,t,r,s={})=>{if(!r&&$e(t))return;const o=r&&r.startsWith("~/"),n=o&&e.state?.root||e.state;if(n?.update)if(o){const u=r.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&!$e(t)&&u in t?n.update(t,{preventFetch:!0,...s}):n.update({[u]:t},{preventFetch:!0,...s})}else{const u=r?{[r]:t}:t;n.update(u,{preventFetch:!0,...s})}},ze=Object.freeze({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),je=e=>({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:e,status:"error",fetchStatus:"idle"}),N=(e,t)=>{const r=e?.__ref;r&&(r.__fetchStatus={...t,isError:!!t.error},r.__fetching=t.isFetching,r.__fetchError=t.error)},ot=(e,t,r)=>{const s=e.__pages&&e.__pages.length?e.__pages:[r];(0,i.isFunction)(t.getNextPageParam)&&(e.__nextPageParam=t.getNextPageParam(s[s.length-1],s),e.__hasNextPage=e.__nextPageParam!=null),(0,i.isFunction)(t.getPreviousPageParam)&&(e.__prevPageParam=t.getPreviousPageParam(s[0],s),e.__hasPreviousPage=e.__prevPageParam!=null)},O=async(e,t,r,s={})=>{const o=r?.fetch;if(!o||!t||!t.__ref)return;const n=t.__ref,u=me(t,r);(!n.__fetchScopeOwner||n.__fetchScopeOwner.scope!==u)&&(n.__fetchScopeOwner={scope:u});const c=n.__fetchScopeOwner,a=()=>t.__ref===n&&n.__fetchScopeOwner===c&&me(t,r)===u;if(e.enabled===!1||(0,i.isFunction)(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||(0,i.isFunction)(e.skip)&&e.skip(t,t.state))return;const l=await Qe(o,r);if(!l||!a())return;const{from:h,method:p,query:v,params:Pe,cache:Fe,transform:U,single:ie,auth:ue,fields:B,as:A,limit:Q,offset:L,order:S,headers:ee,baseUrl:E,responseType:G,page:g,cursor:P,infinite:$,placeholderData:x,initialData:V,select:T,keepPreviousData:C}=e,z=f=>((0,i.isFunction)(T)&&(f=T(f,t,t.state)),U&&(f=U(f,t,t.state)),f),R=f=>{N(t,je(f)),F(t,"onFetchError",f),k(e,t,"onFetchError",f)};let Ae=(0,i.isString)(T)?T:void 0;if(v&&(0,i.isFunction)(t.getQuery)){const f=t.getQuery(l.name||"paths");f&&(Ae=f.select||f.length&&f.join(",")||Ae)}const ce=ve(Pe,t,r),D=ne(g,t),Ce=ne(P,t),fe=Ne(e),le=Ee(e)||fe?null:Ie(Fe),ht=et(e,fe||nt(p)),Ge=se(t,r),y=le?Le(e,ce,u,Ge,D,Ce):null;if(!n.__fetchInitialized&&y&&(n.__fetchInitialized=!0,V!==void 0)){const f=(0,i.isFunction)(V)?V():V;re(y,f,null)}if((p==="select"||p==="rpc")&&y&&le&&!s.refresh&&!s.force){const f=te(y);if(f&&!f.error){const d=Date.now()-f.time,w=f.stale||d>(le.staleTime||0);$&&(0,i.isArray)(f.data)&&!n.__pages&&(n.__pages=[f.data],ot(n,e,f.data));const _=z(f.data);if(!a())return;if(!w){N(t,ze),q(t,_,A);return}q(t,_,A)}else if(x!==void 0){const d=(0,i.isFunction)(x)?x(t,t.state):x;d!==void 0&&q(t,d,A)}}const de=y&&!s.force?I.get(y):null;if(de&&!Re(y,Oe.get(de)||0)){try{const f=await Promise.race([de,new Promise((d,w)=>setTimeout(()=>w("DEDUP_TIMEOUT"),15e3))]);if(!a())return;if(f?.error)R(f.error);else if(f?.data!==void 0){const d=!$&&we(y,Oe.get(de)||0),w=z(d?d.data:f.data);if(!a())return;q(t,w,A),F(t,"onFetchComplete",w),k(e,t,"onFetchComplete",w)}}catch(f){if(!a())return;f!=="DEDUP_TIMEOUT"&&R(f)}return}const _t=!te(y)?.data;N(t,{isFetching:!0,isLoading:_t,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const M=r?.analyze?.emitNetwork,Me=M?typeof performance<"u"?performance.now():Date.now():0;M&&M({phase:"start",mode:"query",from:h,method:p,cacheKey:y,lang:Ge});const yt=async()=>{if(!a())return;if(ue!==!1&&l.auth!==!1&&l.getSession){const _=await l.getSession();if(!a())return;if(ue===!0&&!_){const b={message:"Not authenticated"};return R(b),{data:null,error:b}}}const f=l[p];if(!(0,i.isFunction)(f))return{data:null,error:{message:`Method "${p}" not found on adapter`}};const d={from:h,select:Ae,params:ce,single:ie,limit:Q,offset:L,order:S,headers:ee,baseUrl:E};G!==void 0&&(d.responseType=G);const w=se(t,r);if(w&&(d.headers={...d.headers,"Accept-Language":w}),D!==void 0){if((0,i.isObject)(D))D.offset!==void 0&&(d.offset=D.offset),D.limit!==void 0&&(d.limit=D.limit),D.cursor!==void 0&&(d.params={...d.params,cursor:D.cursor});else if(typeof D=="number"){const _=e.pageSize||Q||20;d.offset=(D-1)*_,d.limit=_}}if(Ce!==void 0&&(d.params={...d.params,cursor:Ce}),p==="insert"||p==="update"||p==="upsert"){let _;if(B===!0||e.on==="submit")_=oe(t);else if((0,i.isArray)(B)){const b=oe(t);_={};for(const j of B)_[j]=b[j]}else t.state?.parse?_=t.state.parse():(0,i.isObject)(t.state)&&(_={...t.state});U&&(_=U(_,t,t.state)),d.data=_}if(p==="rpc"){let _=ce;if(e.on==="submit"){const b=oe(t);_=e.transformParams?e.transformParams(b,t,t.state):b}d.params=_,d.read=!fe&&e.read!==!1}if(p==="subscribe"){if((0,i.isFunction)(n.__unsubscribe)){const b=n.__unsubscribe;n.__unsubscribe=null;try{b()}catch{}}const _=l.subscribe({from:h,params:ce,on:e.subscribeOn},(b,j,xe)=>{a()&&(q(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b))});return a()?(n.__unsubscribe=_,{data:null,error:null,subscribed:!0}):((0,i.isFunction)(_)&&_(),{data:null,error:null,subscribed:!0})}return f(d)},W=++be,pe=tt(yt,ht);Oe.set(pe,W),y&&I.set(y,pe);try{const f=await pe;if(fe&&e.invalidates&&f&&!f.error&&!f.subscribed&&it(e.invalidates,h),!a()||f?.subscribed)return;const{data:d,error:w}=f||{};if(w){y&&!we(y,W)&&re(y,null,w,W),R(w),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:w.message||w,durationMs:(typeof performance<"u"?performance.now():Date.now())-Me});return}if(d!==void 0){let _=d;if((p==="select"||p==="rpc")&&y){const j=!$&&we(y,W);if(j)_=j.data;else{const xe=re(y,d,null,W,Re(y,W));xe.gcTime=le?.gcTime||3e5}}let b=_;if($&&(0,i.isArray)(d)&&((!n.__pages||!s.direction)&&(n.__pages=[]),s.direction==="previous"?n.__pages.unshift(d):n.__pages.push(d),b=n.__pages.flat(),ot(n,e,d)),b=z(b),!a())return;N(t,ze),(!C||b!==void 0)&&q(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b),M&&M({phase:"success",mode:"query",ok:!0,from:h,method:p,cacheKey:y,durationMs:(typeof performance<"u"?performance.now():Date.now())-Me})}}catch(f){if(!a())return;R(f),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:f.message||String(f),durationMs:(typeof performance<"u"?performance.now():Date.now())-Me})}finally{y&&I.get(y)===pe&&I.delete(y)}},It=(e,t,r)=>{const s=e.on,o=t.__ref;if(!o)return;o.__fetchListeners||(o.__fetchListeners=[]);const n=e.__runner||O;if(s==="submit"){const u=a=>{a.preventDefault(),n(e,t,r)},c=t.node;c&&(c.addEventListener("submit",u),o.__fetchListeners.push(()=>c.removeEventListener("submit",u)))}else if(s==="click"){const u=()=>n(e,t,r),c=t.node;c&&(c.addEventListener("click",u),o.__fetchListeners.push(()=>c.removeEventListener("click",u)))}else s==="stateChange"&&qt(e,t,r,n)},qt=(e,t,r,s)=>{const o=t.__ref;let n;const u=(0,lt.createEffect)(()=>{let c;try{c=JSON.stringify([ve(e.params,t,r)??null,(0,i.isFunction)(e.enabled)?!!e.enabled(t,t.state):e.enabled!==!1,(0,i.isFunction)(e.skip)?!!e.skip(t,t.state):e.skip===!0,ne(e.page,t)??null])}catch{return}if(n===void 0){n=c;return}c!==n&&(n=c,Promise.resolve().then(()=>s(e,t,r)))});Array.isArray(o.__effects)?o.__effects.push(u):o.__fetchListeners.push(()=>u.dispose())},Nt=(e,t,r)=>{const s=t.__ref;s.__fetchCleanups||(s.__fetchCleanups=[]),Ot();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:X(o);if(a>0){const l=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&O(e,t,r,{force:!0})},a);s.__fetchCleanups.push(()=>clearInterval(l))}}const n=Ee(e),u=e.refetchOnWindowFocus===void 0?!n:e.refetchOnWindowFocus!==!1,c=e.refetchOnReconnect===void 0?!n:e.refetchOnReconnect!==!1;if(u){const a=()=>{const l=Ue(e,t,r),h=te(l),p=Ie(e.cache);(!h||h.stale||Date.now()-h.time>(p?.staleTime||0))&&O(e,t,r,{force:!0})};H.focus.add(a),s.__fetchCleanups.push(()=>H.focus.delete(a))}if(c){const a=()=>O(e,t,r,{force:!0});H.online.add(a),s.__fetchCleanups.push(()=>H.online.delete(a))}},Ut=(e,t,r)=>{if(!t.optimistic)return null;const s=e.__ref,o=t.as,n=e.state?.parse?e.state.parse():(0,i.isObject)(e.state)?{...e.state}:e.state;s.__optimisticSnapshot=n;const u=(0,i.isFunction)(t.optimistic)?t.optimistic(r,n,e):t.optimistic;return u!==void 0&&q(e,u,o),n},Ke=(e,t)=>{const r=e.__ref;if(!r||!t.optimistic)return;const s=r.__optimisticSnapshot;s!==void 0&&(q(e,s,t.as),delete r.__optimisticSnapshot)},Ye=e=>{if(!e)return()=>!0;if((0,i.isString)(e))return t=>t.includes(e);if((0,i.isArray)(e)){const t=e.join(":");return r=>r.includes(t)}return e instanceof RegExp?t=>(e.lastIndex=0,e.test(t)):(0,i.isFunction)(e)?t=>{try{return!!e(t)}catch{return!1}}:()=>!1},Qt=e=>{const t=[];for(const r of Y){if(!Xe(r)){Y.delete(r);continue}const s=Mt(r);s&&e(s)&&t.push(O(r.config,r.element,r.context,{refresh:!0}))}return Promise.allSettled(t).then(()=>{})},at=e=>{(0,dt.dropEarly)();for(const[t,r]of m)e(t)&&(r.stale=!0,ge(t));for(const[t]of I)!m.has(t)&&e(t)&&ge(t);return Qt(e)},it=(e,t)=>{const r=((0,i.isArray)(e)?e:[e]).map(s=>s===!0||s==="*"?o=>o.startsWith(t+":"):s?Ye(s):()=>!1);return at(s=>r.some(o=>o(s)))},ut=e=>{for(const[t]of m)e(t)&&He(t);for(const[t]of I)e(t)&&ge(t)},ct=()=>!0,$t=async(e,t,r)=>{const s=r?.fetch;if(!s)return;const o=await Qe(s,r);if(!o)return;const n=t.__ref,{method:u,from:c,fields:a,transform:l,as:h,on:p,auth:v,headers:Pe,baseUrl:Fe,responseType:U,invalidates:ie,optimistic:ue,onMutate:B,onSuccess:A,onError:Q,onSettled:L}=e;let S;if(a===!0||p==="submit")S=oe(t);else if((0,i.isArray)(a)){const g=oe(t);S={};for(const P of a)S[P]=g[P]}else t.state?.parse?S=t.state.parse():(0,i.isObject)(t.state)&&(S={...t.state});l&&(S=l(S,t,t.state)),(0,i.isFunction)(B)&&B(S,t,t.state);const ee=ue?Ut(t,e,S):null;N(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const E=r?.analyze?.emitNetwork,G=E?typeof performance<"u"?performance.now():Date.now():0;E&&E({phase:"start",mode:"mutation",from:c,method:u});try{if(v!==!1&&o.auth!==!1&&o.getSession){const z=await o.getSession();if(v===!0&&!z){ee!==void 0&&Ke(t,e);const R={message:"Not authenticated"};F(t,"onFetchError",R),k(e,t,"onFetchError",R);return}}const g=o[u];if(!(0,i.isFunction)(g))return;const P={from:c,data:S,headers:Pe,baseUrl:Fe};U!==void 0&&(P.responseType=U),e.params&&(P.params=ve(e.params,t,r));const $=se(t,r);$&&(P.headers={...P.headers,"Accept-Language":$});const x=et(e,!0),V=await tt(()=>g(P),x),{data:T,error:C}=V||{};if(C){ee!==void 0&&Ke(t,e),N(t,je(C)),F(t,"onFetchError",C),(0,i.isFunction)(Q)&&Q(C,S,t),(0,i.isFunction)(L)&&L(null,C,S,t),E&&E({phase:"error",mode:"mutation",from:c,method:u,error:C.message||String(C),durationMs:(typeof performance<"u"?performance.now():Date.now())-G});return}if(delete n.__optimisticSnapshot,N(t,ze),T!==void 0&&(h||!$e(T))){const z=h?{[h]:T}:T;t.state?.update&&t.state.update(z,{preventFetch:!0})}F(t,"onFetchComplete",T),k(e,t,"onFetchComplete",T),(0,i.isFunction)(A)&&A(T,S,t),(0,i.isFunction)(L)&&L(T,null,S,t),E&&E({phase:"success",mode:"mutation",ok:!0,from:c,method:u,durationMs:(typeof performance<"u"?performance.now():Date.now())-G}),ie&&it(ie,c)}catch(g){ee!==void 0&&Ke(t,e),N(t,je(g)),F(t,"onFetchError",g),k(e,t,"onFetchError",g),(0,i.isFunction)(Q)&&Q(g,S,t),(0,i.isFunction)(L)&&L(null,g,S,t),E&&E({phase:"error",mode:"mutation",from:c,method:u,error:g.message||String(g),durationMs:(typeof performance<"u"?performance.now():Date.now())-G})}finally{n.__fetching=!1}},zt=e=>{const t=r=>{try{r()}catch{}};for(const r of e.__fetchCleanups||[])t(r);for(const r of e.__fetchListeners||[])t(r);(0,i.isFunction)(e.__unsubscribe)&&t(e.__unsubscribe);for(const r of e.__fetchMounted||[])Y.delete(r);e.__fetchCleanups=[],e.__fetchListeners=[],e.__unsubscribe=null,e.__fetchMounted=[]},Be=(e,t,r,s)=>{if(!e||!s?.fetch)return;const n=(0,i.exec)(e,t);if(!n)return;const u=(0,i.isArray)(n)?n.map(a=>st((0,i.exec)(a,t),t)).filter(Boolean):[st(n,t)].filter(Boolean),c=t.__ref;if(c.__fetchMounted)for(const a of c.__fetchMounted)Y.delete(a);c.__fetchMounted=[],!c.__fetchDisposer&&(0,i.isArray)(c.__effects)&&(c.__fetchDisposer={dispose:()=>zt(c)},c.__effects.push(c.__fetchDisposer));for(const a of u){const l=nt(a.method),h=l?$t:O,p=!l&&!Ne(a)&&a.method!=="subscribe";if(a.on==="create"?h(a,t,s):Promise.resolve().then(()=>{It({...a,__runner:h},t,s)}),p&&a.on==="create"&&((a.refetchInterval||a.refetchOnWindowFocus!==!1||a.refetchOnReconnect!==!1)&&Nt(a,t,s),!Ee(a))){const v={element:t,ref:c,config:a,context:s};Y.add(v),c.__fetchMounted.push(v)}}c.refetch=a=>{for(const l of u)O(l,t,s,{force:!0,...a})},c.fetchNextPage=()=>{const a=u[0];if(!a||!a.infinite)return;const l=c.__nextPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"next",force:!0})},c.fetchPreviousPage=()=>{const a=u[0];if(!a||!a.infinite)return;const l=c.__prevPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"previous",force:!0})}},ae={invalidateQueries:e=>at(Ye(e)),removeQueries:e=>{ut(e?Ye(e):ct)},getQueryData:e=>te(e)?.data??void 0,setQueryData:(e,t)=>{const r=te(e),s=(0,i.isFunction)(t)?t(r?.data):t;re(e,s,null)},prefetchQuery:async(e,t)=>{const r=t?.fetch;if(!r)return;const s=await Qe(r,t);if(!s)return;const o=e.method||"select",n=me(null,t),u=se(null,t),c=Le({...e,method:o},e.params,n,u),a=s[o];if(!(0,i.isFunction)(a))return;const l={from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single,headers:e.headers,baseUrl:e.baseUrl};u&&(l.headers={...l.headers,"Accept-Language":u}),e.responseType!==void 0&&(l.responseType=e.responseType),o==="rpc"&&(l.read=!Ne(e)&&e.read!==!1);const h=++be,p=await a(l);if(p?.data!==void 0&&!p?.error&&!Ee(e)&&!we(c,h)){const v=re(c,p.data,null,h,Re(c,h));v.gcTime=Ie(e.cache)?.gcTime||3e5}return p},getCache:()=>m,clear:()=>ut(ct),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[r]of m)r.match(/:([a-z]{2,3})$/i)&&(r.endsWith(t)||He(r))}},ft=(e,t)=>(0,i.isObject)(e)?Ue({method:"select",...e},t,t?.context):e,jt={invalidateQueries(e){return ae.invalidateQueries(e)},removeQueries(e){return ae.removeQueries(e)},getQueryData(e){return ae.getQueryData(ft(e,this))},setQueryData(e,t){return ae.setQueryData(ft(e,this),t)}},Kt={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||I.clear(),Be(t,e,e.state,e.context))}};var Yt=Be;
1
+ "use strict";var gt=Object.create;var _e=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var vt=Object.getPrototypeOf,Et=Object.prototype.hasOwnProperty;var Dt=(e,t)=>{for(var r in t)_e(e,r,{get:t[r],enumerable:!0})},Xe=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of mt(t))!Et.call(e,o)&&o!==r&&_e(e,o,{get:()=>t[o],enumerable:!(s=Tt(t,o))||s.enumerable});return e};var Ze=(e,t,r)=>(r=e!=null?gt(vt(e)):{},Xe(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e)),Pt=e=>Xe(_e({},"__esModule",{value:!0}),e);var Vt={};Dt(Vt,{EARLY_KEY:()=>A.EARLY_KEY,SEED_BLOCK:()=>A.SEED_BLOCK,createAdapter:()=>Lt,createEarlySeedBlock:()=>A.createEarlySeedBlock,createEarlySeedScript:()=>A.createEarlySeedScript,default:()=>Wt,earlyKey:()=>A.earlyKey,executeFetch:()=>Ve,fetchFunctions:()=>Yt,fetchPlugin:()=>Gt,hasAdapter:()=>Ot,initAdapterAuth:()=>Pe,parseDuration:()=>ee,queryClient:()=>ie,registerAdapter:()=>kt,requestsInFlight:()=>Fe.requestsInFlight,resolveDb:()=>yt,whenRequestsIdle:()=>Fe.whenRequestsIdle});module.exports=Pt(Vt);var i=require("@symbo.ls/utils"),ht=require("@symbo.ls/signal"),_t=require("./early.js"),Ft=Ze(require("./adapters/rest.js"),1),A=require("./early.js"),Fe=require("./inflight.js");const At=["select","rpc","insert","update","upsert","delete","subscribe"],et={rest:()=>Promise.resolve(Ft),local:()=>import("./adapters/local.js")},ye=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),H=(()=>{if(typeof globalThis<"u"&&globalThis[ye])return globalThis[ye];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ye,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ye]}catch{}return e})(),be=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),Le=(()=>{if(typeof globalThis<"u"&&globalThis[be])return globalThis[be];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,be,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[be]}catch{}return e})(),Ct=5e3,Mt=e=>new Promise(t=>{if(H[e])return t(H[e]);const r=Le[e]||=[];let s=!1;const o=()=>{s||(s=!0,t(H[e]||null))};r.push(o),setTimeout(o,Ct)}),kt=(e,t)=>{H[e]=t;const r=Le[e];if(r&&r.length){Le[e]=[];for(const s of r)s()}},Ot=e=>typeof e=="string"&&!!(H[e]||et[e]),Lt=e=>{const t={};for(const r of At)e[r]&&(t[r]=e[r]);return t.name=e.name||"custom",t},yt=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...r}=e,s=typeof t=="string"?t:typeof e=="string"?e:null;if(!s)return null;let o=H[s]||et[s];if(!o&&(o=await Mt(s),!o))throw new Error(`Unknown db adapter: "${s}". Use registerAdapter() for adapters with optional deps.`);const n=await o();if(!n||typeof n.setup!="function")throw new Error(`Adapter "${s}" loader returned a module without a setup() function. Got keys: [${Object.keys(n||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return n.setup(r)},ee=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 r=parseInt(t[1]),s=t[2];return s==="ms"?r:s==="s"?r*1e3:s==="m"?r*6e4:s==="h"?r*36e5:0},m=new Map,x=new Map,I=new Map;let Se=0;const we=new Map,Re=new WeakMap,qe=(e,t,r,s,o=e.page,n=e.cursor)=>{if(e.cache?.key)return e.cache.key;const{from:u,method:c,infinite:a}=e,l=r?`${r}:`:"",h=s?`:${s}`:"",p=o?":p"+JSON.stringify(o):"",v=n!=null?":c"+JSON.stringify(n):"";return`${u}:${c}:${l}${JSON.stringify(t||"")}${a?":infinite":""}${p}${v}${h}`},re=e=>m.get(e)||null,se=(e,t,r,s=++Se,o=!1)=>{const n={data:t,error:r,time:Date.now(),stale:o,seq:s};m.set(e,n);const u=x.get(e);if(u)for(const c of u)(0,i.isFunction)(c)&&c(n);return n},ge=(e,t)=>{const r=e?m.get(e):null;return r&&!r.error&&r.seq>t?r:null},Ie=(e,t)=>(we.get(e)||0)>t,Te=e=>{we.set(e,++Se)},tt=e=>{m.delete(e),Te(e)},Ht=(e,t)=>(x.has(e)||x.set(e,new Set),x.get(e).add(t),()=>{const r=x.get(e);r&&(r.delete(t),r.size===0&&x.delete(e))}),Ne=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,i.isString)(e)?{staleTime:ee(e),gcTime:3e5}:{staleTime:ee(e.stale||e.staleTime)||6e4,gcTime:ee(e.gc||e.gcTime||e.expire)||3e5,key:e.key},N=new Set,rt=e=>!!e.ref&&e.element.__ref===e.ref,Rt=({config:e,element:t,context:r})=>{try{return $e(e,t,r)}catch{return null}};let me=null;const qt=()=>{me||(me=setInterval(()=>{const e=Date.now();for(const[t,r]of m){const s=x.get(t);!(s&&s.size>0)&&e-r.time>(r.gcTime||3e5)&&m.delete(t)}for(const[t]of we)!m.has(t)&&!I.has(t)&&we.delete(t);for(const t of N)rt(t)||N.delete(t)},3e4),me.unref&&me.unref())};qt();const st=3,Ue=e=>Math.min(1e3*2**e,3e4),nt=(e,t)=>{const r=e.retry;return r===void 0&&t?{count:0}:r===!1?{count:0}:r===!0||r===void 0?{count:st,delay:Ue}:typeof r=="number"?{count:r,delay:Ue}:{count:r.count??st,delay:(0,i.isFunction)(r.delay)?r.delay:typeof r.delay=="number"?()=>r.delay:Ue}},ot=async(e,t)=>{const{count:r,delay:s}=t;let o;for(let n=0;n<=r;n++)try{const u=await e();if(u?.error){if(o=u.error,n<r){const c=(0,i.isFunction)(s)?s(n,o):s;await new Promise(a=>setTimeout(a,c));continue}return u}return u}catch(u){if(o=u,n<r){const c=(0,i.isFunction)(s)?s(n,u):s;await new Promise(a=>setTimeout(a,c));continue}throw u}return{data:null,error:o}},X={focus:new Set,online:new Set};let at=!1;const It=()=>{if(at||typeof window>"u")return;at=!0;const e=()=>{for(const r of X.focus)r()},t=()=>{for(const r of X.online)r()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},it=(e,t)=>{const r=t.__ref;if(e===!0)return{from:r.__state||t.key,method:"select",query:!0,on:"create"};if((0,i.isString)(e))return{from:e,method:"select",query:!0,on:"create"};if((0,i.isObject)(e)){const s={...e};return s.from=s.from||r.__state||t.key,s.method=s.method||"select",s.on=s.on||"create",s.query===void 0&&(s.query=!0),s}return null},Nt=["insert","update","upsert","delete"],ut=e=>Nt.includes(e),Qe=e=>e.mutation===!0?!0:e.mutation===!1||e.method!=="rpc"?!1:e.on==="submit"||e.on==="click"||e.invalidates!=null,ne=(e,t)=>{const r=e?.state?.root||t?.state?.root;if(r?.lang)return r.lang},ve=(e,t)=>{const s=(e?.state?.root||t?.state?.root)?.__fetchScope;return s?String(s):void 0},Ee=(e,t,r)=>{let s;if(!e)s=void 0;else if((0,i.isFunction)(e))s=e(t,t.state);else{s={};for(const o in e){const n=e[o];s[o]=(0,i.isFunction)(n)?n(t,t.state):n}}return s},oe=(e,t)=>(0,i.isFunction)(e)?e(t,t.state):e,$e=(e,t,r)=>qe(e,Ee(e.params,t,r),ve(t,r),ne(t,r),oe(e.page,t),oe(e.cursor,t)),Pe=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const r=(s,o)=>{const n=t.state?.root;n?.update&&n.update({auth:{user:s,session:o,loading:!1}})};try{const s=await e.getSession();r(s?.user||null,s)}catch(s){console.warn("[fetch] Failed to restore auth session:",s.message)}e.onAuthStateChange&&e.onAuthStateChange((s,o)=>{r(o?.user||null,o)})},ze=async(e,t)=>{if((0,i.isFunction)(e.select))return e.auth!==!1&&await Pe(e,t),e;if(e.__resolved)return e.auth!==!1&&await Pe(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=yt(e);const r=await e.__resolving;return delete e.__resolving,r?(r.auth=e.auth,r.url=e.url,r.key=e.key,e.__resolved=r,t.fetch=r,e.auth!==!1&&await Pe(r,t),r):null},F=(e,t,...r)=>{const s=(0,i.isFunction)(e[t])?e[t]:null;s&&s.call(e,...r,e,e.state,e.context)},O=(e,t,r,...s)=>{const o=e&&(0,i.isFunction)(e[r])?e[r]:null;o&&o.call(t,...s,t,t.state,t.context)},ae=e=>{const t={},r=e.node;if(!r)return t;if(r.tagName==="FORM"){const o=new FormData(r);for(const[n,u]of o.entries())t[n]=u;return t}const s=r.querySelectorAll("input, textarea, select");for(let o=0;o<s.length;o++){const n=s[o],u=n.name||n.getAttribute("name");u&&(n.type==="checkbox"?t[u]=n.checked:n.type==="file"?t[u]=n.files:t[u]=n.value)}return t},De=e=>e.responseType==="stream"||e.responseType==="response",Ut=["Blob","File","ArrayBuffer","ReadableStream","Response"],je=e=>e!==null&&typeof e=="object"&&(ArrayBuffer.isView(e)||Ut.includes(Object.prototype.toString.call(e).slice(8,-1))),U=(e,t,r,s={})=>{if(!r&&je(t))return;const o=r&&r.startsWith("~/"),n=o&&e.state?.root||e.state;if(n?.update)if(o){const u=r.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&!je(t)&&u in t?n.update(t,{preventFetch:!0,...s}):n.update({[u]:t},{preventFetch:!0,...s})}else{const u=r?{[r]:t}:t;n.update(u,{preventFetch:!0,...s})}},Be=Object.freeze({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),Ke=e=>({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:e,status:"error",fetchStatus:"idle"}),Q=(e,t)=>{const r=e?.__ref;r&&(r.__fetchStatus={...t,isError:!!t.error},r.__fetching=t.isFetching,r.__fetchError=t.error)},ct=(e,t,r)=>{const s=e.__pages&&e.__pages.length?e.__pages:[r];(0,i.isFunction)(t.getNextPageParam)&&(e.__nextPageParam=t.getNextPageParam(s[s.length-1],s),e.__hasNextPage=e.__nextPageParam!=null),(0,i.isFunction)(t.getPreviousPageParam)&&(e.__prevPageParam=t.getPreviousPageParam(s[0],s),e.__hasPreviousPage=e.__prevPageParam!=null)},L=async(e,t,r,s={})=>{const o=r?.fetch;if(!o||!t||!t.__ref)return;const n=t.__ref,u=ve(t,r);(!n.__fetchScopeOwner||n.__fetchScopeOwner.scope!==u)&&(n.__fetchScopeOwner={scope:u});const c=n.__fetchScopeOwner,a=()=>t.__ref===n&&n.__fetchScopeOwner===c&&ve(t,r)===u;if(e.enabled===!1||(0,i.isFunction)(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||(0,i.isFunction)(e.skip)&&e.skip(t,t.state))return;const l=await ze(o,r);if(!l||!a())return;const{from:h,method:p,query:v,params:Ae,cache:Ce,transform:$,single:ue,auth:ce,fields:Y,as:C,limit:z,offset:R,order:S,headers:te,baseUrl:E,responseType:G,page:g,cursor:P,infinite:j,placeholderData:W,initialData:V,select:T,keepPreviousData:M}=e,B=f=>((0,i.isFunction)(T)&&(f=T(f,t,t.state)),$&&(f=$(f,t,t.state)),f),q=f=>{Q(t,Ke(f)),F(t,"onFetchError",f),O(e,t,"onFetchError",f)};let Me=(0,i.isString)(T)?T:void 0;if(v&&(0,i.isFunction)(t.getQuery)){const f=t.getQuery(l.name||"paths");f&&(Me=f.select||f.length&&f.join(",")||Me)}const fe=Ee(Ae,t,r),D=oe(g,t),ke=oe(P,t),le=Qe(e),de=De(e)||le?null:Ne(Ce),bt=nt(e,le||ut(p)),Je=ne(t,r),y=de?qe(e,fe,u,Je,D,ke):null;if(!n.__fetchInitialized&&y&&(n.__fetchInitialized=!0,V!==void 0)){const f=(0,i.isFunction)(V)?V():V;se(y,f,null)}if((p==="select"||p==="rpc")&&y&&de&&!s.refresh&&!s.force){const f=re(y);if(f&&!f.error){const d=Date.now()-f.time,w=f.stale||d>(de.staleTime||0);j&&(0,i.isArray)(f.data)&&!n.__pages&&(n.__pages=[f.data],ct(n,e,f.data));const _=B(f.data);if(!a())return;if(!w){Q(t,Be),U(t,_,C);return}U(t,_,C)}else if(W!==void 0){const d=(0,i.isFunction)(W)?W(t,t.state):W;d!==void 0&&U(t,d,C)}}const pe=y&&!s.force?I.get(y):null;if(pe&&!Ie(y,Re.get(pe)||0)){try{const f=await Promise.race([pe,new Promise((d,w)=>setTimeout(()=>w("DEDUP_TIMEOUT"),15e3))]);if(!a())return;if(f?.error)q(f.error);else if(f?.data!==void 0){const d=!j&&ge(y,Re.get(pe)||0),w=B(d?d.data:f.data);if(!a())return;U(t,w,C),F(t,"onFetchComplete",w),O(e,t,"onFetchComplete",w)}}catch(f){if(!a())return;f!=="DEDUP_TIMEOUT"&&q(f)}return}const St=!re(y)?.data;Q(t,{isFetching:!0,isLoading:St,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),O(e,t,"onFetchStart");const k=r?.analyze?.emitNetwork,Oe=k?typeof performance<"u"?performance.now():Date.now():0;k&&k({phase:"start",mode:"query",from:h,method:p,cacheKey:y,lang:Je});const wt=async()=>{if(!a())return;if(ce!==!1&&l.auth!==!1&&l.getSession){const _=await l.getSession();if(!a())return;if(ce===!0&&!_){const b={message:"Not authenticated"};return q(b),{data:null,error:b}}}const f=l[p];if(!(0,i.isFunction)(f))return{data:null,error:{message:`Method "${p}" not found on adapter`}};const d={from:h,select:Me,params:fe,single:ue,limit:z,offset:R,order:S,headers:te,baseUrl:E};G!==void 0&&(d.responseType=G);const w=ne(t,r);if(w&&(d.headers={...d.headers,"Accept-Language":w}),D!==void 0){if((0,i.isObject)(D))D.offset!==void 0&&(d.offset=D.offset),D.limit!==void 0&&(d.limit=D.limit),D.cursor!==void 0&&(d.params={...d.params,cursor:D.cursor});else if(typeof D=="number"){const _=e.pageSize||z||20;d.offset=(D-1)*_,d.limit=_}}if(ke!==void 0&&(d.params={...d.params,cursor:ke}),p==="insert"||p==="update"||p==="upsert"){let _;if(Y===!0||e.on==="submit")_=ae(t);else if((0,i.isArray)(Y)){const b=ae(t);_={};for(const K of Y)_[K]=b[K]}else t.state?.parse?_=t.state.parse():(0,i.isObject)(t.state)&&(_={...t.state});$&&(_=$(_,t,t.state)),d.data=_}if(p==="rpc"){let _=fe;if(e.on==="submit"){const b=ae(t);_=e.transformParams?e.transformParams(b,t,t.state):b}d.params=_,d.read=!le&&e.read!==!1}if(p==="subscribe"){if((0,i.isFunction)(n.__unsubscribe)){const b=n.__unsubscribe;n.__unsubscribe=null;try{b()}catch{}}const _=l.subscribe({from:h,params:fe,on:e.subscribeOn},(b,K,He)=>{a()&&(U(t,b,C),F(t,"onFetchComplete",b),O(e,t,"onFetchComplete",b))});return a()?(n.__unsubscribe=_,{data:null,error:null,subscribed:!0}):((0,i.isFunction)(_)&&_(),{data:null,error:null,subscribed:!0})}return f(d)},J=++Se,he=ot(wt,bt);Re.set(he,J),y&&I.set(y,he);try{const f=await he;if(le&&e.invalidates&&f&&!f.error&&!f.subscribed&&lt(e.invalidates,h),!a()||f?.subscribed)return;const{data:d,error:w}=f||{};if(w){y&&!ge(y,J)&&se(y,null,w,J),q(w),k&&k({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:w.message||w,durationMs:(typeof performance<"u"?performance.now():Date.now())-Oe});return}if(d!==void 0){let _=d;if((p==="select"||p==="rpc")&&y){const K=!j&&ge(y,J);if(K)_=K.data;else{const He=se(y,d,null,J,Ie(y,J));He.gcTime=de?.gcTime||3e5}}let b=_;if(j&&(0,i.isArray)(d)&&((!n.__pages||!s.direction)&&(n.__pages=[]),s.direction==="previous"?n.__pages.unshift(d):n.__pages.push(d),b=n.__pages.flat(),ct(n,e,d)),b=B(b),!a())return;Q(t,Be),(!M||b!==void 0)&&U(t,b,C),F(t,"onFetchComplete",b),O(e,t,"onFetchComplete",b),k&&k({phase:"success",mode:"query",ok:!0,from:h,method:p,cacheKey:y,durationMs:(typeof performance<"u"?performance.now():Date.now())-Oe})}}catch(f){if(!a())return;q(f),k&&k({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:f.message||String(f),durationMs:(typeof performance<"u"?performance.now():Date.now())-Oe})}finally{y&&I.get(y)===he&&I.delete(y)}},Qt=(e,t,r)=>{const s=e.on,o=t.__ref;if(!o)return;o.__fetchListeners||(o.__fetchListeners=[]);const n=e.__runner||L;if(s==="submit"){const u=a=>{a.preventDefault(),n(e,t,r)},c=t.node;c&&(c.addEventListener("submit",u),o.__fetchListeners.push(()=>c.removeEventListener("submit",u)))}else if(s==="click"){const u=()=>n(e,t,r),c=t.node;c&&(c.addEventListener("click",u),o.__fetchListeners.push(()=>c.removeEventListener("click",u)))}else s==="stateChange"&&$t(e,t,r,n)},$t=(e,t,r,s)=>{const o=t.__ref;let n;const u=(0,ht.createEffect)(()=>{let c;try{c=JSON.stringify([Ee(e.params,t,r)??null,(0,i.isFunction)(e.enabled)?!!e.enabled(t,t.state):e.enabled!==!1,(0,i.isFunction)(e.skip)?!!e.skip(t,t.state):e.skip===!0,oe(e.page,t)??null])}catch{return}if(n===void 0){n=c;return}c!==n&&(n=c,queueMicrotask(()=>s(e,t,r)))});Array.isArray(o.__effects)?o.__effects.push(u):o.__fetchListeners.push(()=>u.dispose())},zt=(e,t,r)=>{const s=t.__ref;s.__fetchCleanups||(s.__fetchCleanups=[]),It();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:ee(o);if(a>0){const l=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&L(e,t,r,{force:!0})},a);s.__fetchCleanups.push(()=>clearInterval(l))}}const n=De(e),u=e.refetchOnWindowFocus===void 0?!n:e.refetchOnWindowFocus!==!1,c=e.refetchOnReconnect===void 0?!n:e.refetchOnReconnect!==!1;if(u){const a=()=>{const l=$e(e,t,r),h=re(l),p=Ne(e.cache);(!h||h.stale||Date.now()-h.time>(p?.staleTime||0))&&L(e,t,r,{force:!0})};X.focus.add(a),s.__fetchCleanups.push(()=>X.focus.delete(a))}if(c){const a=()=>L(e,t,r,{force:!0});X.online.add(a),s.__fetchCleanups.push(()=>X.online.delete(a))}},jt=(e,t,r)=>{if(!t.optimistic)return null;const s=e.__ref,o=t.as,n=e.state?.parse?e.state.parse():(0,i.isObject)(e.state)?{...e.state}:e.state;s.__optimisticSnapshot=n;const u=(0,i.isFunction)(t.optimistic)?t.optimistic(r,n,e):t.optimistic;return u!==void 0&&U(e,u,o),n},xe=(e,t)=>{const r=e.__ref;if(!r||!t.optimistic)return;const s=r.__optimisticSnapshot;s!==void 0&&(U(e,s,t.as),delete r.__optimisticSnapshot)},Ye=e=>{if(!e)return()=>!0;if((0,i.isString)(e))return t=>t.includes(e);if((0,i.isArray)(e)){const t=e.join(":");return r=>r.includes(t)}return e instanceof RegExp?t=>(e.lastIndex=0,e.test(t)):(0,i.isFunction)(e)?t=>{try{return!!e(t)}catch{return!1}}:()=>!1},Bt=e=>{const t=[];for(const r of N){if(!rt(r)){N.delete(r);continue}const s=Rt(r);s&&e(s)&&t.push(L(r.config,r.element,r.context,{refresh:!0}))}return Promise.allSettled(t).then(()=>{})},ft=e=>{(0,_t.dropEarly)();for(const[t,r]of m)e(t)&&(r.stale=!0,Te(t));for(const[t]of I)!m.has(t)&&e(t)&&Te(t);return Bt(e)},lt=(e,t)=>{const r=((0,i.isArray)(e)?e:[e]).map(s=>s===!0||s==="*"?o=>o.startsWith(t+":"):s?Ye(s):()=>!1);return ft(s=>r.some(o=>o(s)))},Ge=e=>{for(const[t]of m)e(t)&&tt(t);for(const[t]of I)e(t)&&Te(t)},We=()=>!0,dt=new WeakSet,Z=e=>{!e||!e.isolateFetchCache||dt.has(e)||(dt.add(e),Ge(We),N.clear())},Kt=async(e,t,r)=>{const s=r?.fetch;if(!s)return;const o=await ze(s,r);if(!o)return;const n=t.__ref,{method:u,from:c,fields:a,transform:l,as:h,on:p,auth:v,headers:Ae,baseUrl:Ce,responseType:$,invalidates:ue,optimistic:ce,onMutate:Y,onSuccess:C,onError:z,onSettled:R}=e;let S;if(a===!0||p==="submit")S=ae(t);else if((0,i.isArray)(a)){const g=ae(t);S={};for(const P of a)S[P]=g[P]}else t.state?.parse?S=t.state.parse():(0,i.isObject)(t.state)&&(S={...t.state});l&&(S=l(S,t,t.state)),(0,i.isFunction)(Y)&&Y(S,t,t.state);const te=ce?jt(t,e,S):null;Q(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),O(e,t,"onFetchStart");const E=r?.analyze?.emitNetwork,G=E?typeof performance<"u"?performance.now():Date.now():0;E&&E({phase:"start",mode:"mutation",from:c,method:u});try{if(v!==!1&&o.auth!==!1&&o.getSession){const B=await o.getSession();if(v===!0&&!B){te!==void 0&&xe(t,e);const q={message:"Not authenticated"};F(t,"onFetchError",q),O(e,t,"onFetchError",q);return}}const g=o[u];if(!(0,i.isFunction)(g))return;const P={from:c,data:S,headers:Ae,baseUrl:Ce};$!==void 0&&(P.responseType=$),e.params&&(P.params=Ee(e.params,t,r));const j=ne(t,r);j&&(P.headers={...P.headers,"Accept-Language":j});const W=nt(e,!0),V=await ot(()=>g(P),W),{data:T,error:M}=V||{};if(M){te!==void 0&&xe(t,e),Q(t,Ke(M)),F(t,"onFetchError",M),(0,i.isFunction)(z)&&z(M,S,t),(0,i.isFunction)(R)&&R(null,M,S,t),E&&E({phase:"error",mode:"mutation",from:c,method:u,error:M.message||String(M),durationMs:(typeof performance<"u"?performance.now():Date.now())-G});return}if(delete n.__optimisticSnapshot,Q(t,Be),T!==void 0&&(h||!je(T))){const B=h?{[h]:T}:T;t.state?.update&&t.state.update(B,{preventFetch:!0})}F(t,"onFetchComplete",T),O(e,t,"onFetchComplete",T),(0,i.isFunction)(C)&&C(T,S,t),(0,i.isFunction)(R)&&R(T,null,S,t),E&&E({phase:"success",mode:"mutation",ok:!0,from:c,method:u,durationMs:(typeof performance<"u"?performance.now():Date.now())-G}),ue&&lt(ue,c)}catch(g){te!==void 0&&xe(t,e),Q(t,Ke(g)),F(t,"onFetchError",g),O(e,t,"onFetchError",g),(0,i.isFunction)(z)&&z(g,S,t),(0,i.isFunction)(R)&&R(null,g,S,t),E&&E({phase:"error",mode:"mutation",from:c,method:u,error:g.message||String(g),durationMs:(typeof performance<"u"?performance.now():Date.now())-G})}finally{n.__fetching=!1}},xt=e=>{const t=r=>{try{r()}catch{}};for(const r of e.__fetchCleanups||[])t(r);for(const r of e.__fetchListeners||[])t(r);(0,i.isFunction)(e.__unsubscribe)&&t(e.__unsubscribe);for(const r of e.__fetchMounted||[])N.delete(r);e.__fetchCleanups=[],e.__fetchListeners=[],e.__unsubscribe=null,e.__fetchMounted=[]},Ve=(e,t,r,s)=>{if(!e||!s?.fetch)return;Z(s);const n=(0,i.exec)(e,t);if(!n)return;const u=(0,i.isArray)(n)?n.map(a=>it((0,i.exec)(a,t),t)).filter(Boolean):[it(n,t)].filter(Boolean),c=t.__ref;if(c.__fetchMounted)for(const a of c.__fetchMounted)N.delete(a);c.__fetchMounted=[],!c.__fetchDisposer&&(0,i.isArray)(c.__effects)&&(c.__fetchDisposer={dispose:()=>xt(c)},c.__effects.push(c.__fetchDisposer));for(const a of u){const l=ut(a.method),h=l?Kt:L,p=!l&&!Qe(a)&&a.method!=="subscribe";if(a.on==="create"?h(a,t,s):queueMicrotask(()=>Qt({...a,__runner:h},t,s)),p&&a.on==="create"&&((a.refetchInterval||a.refetchOnWindowFocus!==!1||a.refetchOnReconnect!==!1)&&zt(a,t,s),!De(a))){const v={element:t,ref:c,config:a,context:s};N.add(v),c.__fetchMounted.push(v)}}c.refetch=a=>{for(const l of u)L(l,t,s,{force:!0,...a})},c.fetchNextPage=()=>{const a=u[0];if(!a||!a.infinite)return;const l=c.__nextPageParam;if(l==null)return;const h={...a,cursor:l};L(h,t,s,{direction:"next",force:!0})},c.fetchPreviousPage=()=>{const a=u[0];if(!a||!a.infinite)return;const l=c.__prevPageParam;if(l==null)return;const h={...a,cursor:l};L(h,t,s,{direction:"previous",force:!0})}},ie={invalidateQueries:e=>ft(Ye(e)),removeQueries:e=>{Ge(e?Ye(e):We)},getQueryData:e=>re(e)?.data??void 0,setQueryData:(e,t)=>{const r=re(e),s=(0,i.isFunction)(t)?t(r?.data):t;se(e,s,null)},prefetchQuery:async(e,t)=>{const r=t?.fetch;if(!r)return;Z(t);const s=await ze(r,t);if(!s)return;const o=e.method||"select",n=ve(null,t),u=ne(null,t),c=qe({...e,method:o},e.params,n,u),a=s[o];if(!(0,i.isFunction)(a))return;const l={from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single,headers:e.headers,baseUrl:e.baseUrl};u&&(l.headers={...l.headers,"Accept-Language":u}),e.responseType!==void 0&&(l.responseType=e.responseType),o==="rpc"&&(l.read=!Qe(e)&&e.read!==!1);const h=++Se,p=await a(l);if(p?.data!==void 0&&!p?.error&&!De(e)&&!ge(c,h)){const v=se(c,p.data,null,h,Ie(c,h));v.gcTime=Ne(e.cache)?.gcTime||3e5}return p},getCache:()=>m,clear:()=>Ge(We),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[r]of m)r.match(/:([a-z]{2,3})$/i)&&(r.endsWith(t)||tt(r))}},pt=(e,t)=>(0,i.isObject)(e)?$e({method:"select",...e},t,t?.context):e,Yt={invalidateQueries(e){return Z(this?.context),ie.invalidateQueries(e)},removeQueries(e){return Z(this?.context),ie.removeQueries(e)},getQueryData(e){return Z(this?.context),ie.getQueryData(pt(e,this))},setQueryData(e,t){return Z(this?.context),ie.setQueryData(pt(e,this),t)}},Gt={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||I.clear(),Ve(t,e,e.state,e.context))}};var Wt=Ve;
@@ -0,0 +1 @@
1
+ "use strict";var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var h=(t,s)=>{for(var e in s)r(t,e,{get:s[e],enumerable:!0})},w=(t,s,e,c)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of l(s))!a.call(t,o)&&o!==e&&r(t,o,{get:()=>s[o],enumerable:!(c=u(s,o))||c.enumerable});return t};var f=t=>w(r({},"__esModule",{value:!0}),t);var q={};h(q,{requestFinished:()=>b,requestStarted:()=>p,requestsInFlight:()=>g,whenRequestsIdle:()=>m});module.exports=f(q);const i=Symbol.for("@symbo.ls/fetch:IN_FLIGHT"),n=()=>globalThis[i]||(globalThis[i]={count:0,waiters:[]}),p=()=>{n().count++},b=()=>{const t=n();if(t.count=t.count>0?t.count-1:0,t.count===0&&t.waiters.length){const s=t.waiters;t.waiters=[];for(const e of s)e()}},g=()=>n().count,m=()=>{const t=n();return t.count===0?Promise.resolve():new Promise(s=>{t.waiters.push(s)})};
@@ -1 +1 @@
1
- import{openEarly as J,takeEarly as I,earlyKey as W,isScalarParams as Y,withReads as D,queryHeaderEntries as F}from"../early.js";const N=(t,n,r)=>{const d=n&&!n.startsWith("/")?"/":"",a=new URL(`${t}${d}${n}`);if(r)for(const c in r){const s=r[c];s!=null&&a.searchParams.set(c,typeof s=="object"?JSON.stringify(s):s)}return a.toString()},G=({params:t,select:n,limit:r,offset:d,order:a,single:c})=>{const s={...t};return n&&(s.select=n),r&&(s.limit=r),d&&(s.offset=d),c&&(s.single=!0),a&&(typeof a=="string"?s.order=a:Array.isArray(a)?s.order=a.map(b=>`${b.by}:${b.asc===!1?"desc":"asc"}`).join(","):a.by&&(s.order=`${a.by}:${a.asc===!1?"desc":"asc"}`)),s},H=t=>Object.prototype.toString.call(t).slice(8,-1),L=["auto","json","text","blob","arrayBuffer","stream","response"],z={json:async t=>{const n=await t.text();return n?JSON.parse(n):null},text:t=>t.text(),blob:t=>t.blob(),arrayBuffer:t=>t.arrayBuffer(),stream:t=>t.body,response:t=>t},M=t=>{const n=t.headers.get("content-type");return n&&n.includes("json")?t.json():t.text()},Q=async t=>{const n=await t.text(),r=t.headers.get("content-type");if(n&&r&&r.includes("json"))try{return JSON.parse(n)}catch{}return n},_=(t,n)=>t?.message||t?.error||n.statusText||`HTTP ${n.status}`,f=async(t,n,r,d)=>{const a=r??"auto";if(!L.includes(a))throw new TypeError(`@symbo.ls/fetch rest: unknown responseType "${a}" \u2014 use one of: ${L.join(", ")}`);const c=d&&await d||await globalThis.fetch(t,n);if(a==="auto"){const s=await M(c);return{data:s,error:c.ok?null:_(s,c),status:c.status}}if(!c.ok){const s=await Q(a==="response"?c.clone():c);return{data:a==="response"?c:s,error:_(s,c),status:c.status}}return{data:await z[a](c),error:null,status:c.status}},K=["FormData","Blob","File","URLSearchParams","ReadableStream","ArrayBuffer"],V=t=>t!==null&&typeof t=="object"&&(ArrayBuffer.isView(t)||K.includes(H(t))),v=t=>Array.isArray(t)?t:typeof t.entries=="function"?t.entries():Object.entries(t),R=(...t)=>{const n={},r=new Map;for(const d of t)if(d)for(const[a,c]of v(d)){const s=a.toLowerCase();if(r.has(s)&&delete n[r.get(s)],c==null){r.delete(s);continue}r.set(s,a),n[a]=c}return n},X={"Content-Type":"application/json"},Z={"Content-Type":void 0},C=t=>{if(!t||typeof t!="object")return null;const n={};for(const{header:r,param:d}of F(t.query))n[r]=d;return{params:n,rpc:t.rpc==="get"}},tt="content-type",q=(t,n)=>{const r=Object.keys(n);if(!r.length)return t;const d=new URL(t);for(const a of r)d.searchParams.set(a,n[a]);return d.toString()},st=async({url:t,headers:n,auth:r,fetchOptions:d,early:a,reads:c})=>{if(!t)throw new Error("@symbo.ls/fetch rest: url is required");return et(t,n,r,d,a,c)},et=(t,n={},r,d={},a,c)=>{let s=r?.token||null;const b=J(D(a,c),n),x=C(c),B=e=>{if(!x)return null;const o={},l={},i={};for(const u in e){const p=u.toLowerCase();if(p==="authorization")return null;if(p===tt)continue;l[u]=e[u];const y=x.params[p];y?i[y]=e[u]:o[u]=e[u]}return{headers:o,adoptHeaders:l,query:i}},j=(e,o)=>{if(!b)return null;let l="";for(const i in o){const u=i.toLowerCase();if(u==="accept-language")l=String(o[i]);else if(b.carried[u]!==o[i])return null}try{return I(W(e(),l),b.maxAge)}catch{return null}},k=()=>s?{Authorization:`Bearer ${s}`}:null,O=e=>R(n,k(),e),T=e=>({...d,...e}),U=(e,o,l)=>{if(!V(o))return T({method:e,headers:R(n,k(),X,l),body:JSON.stringify(o)});const i={method:e,headers:R(n,k(),Z,l),body:o};return H(o)==="ReadableStream"&&(i.duplex="half"),T(i)},S=(e,o)=>{const l=o||t;if(e&&(e.startsWith("http://")||e.startsWith("https://")))return e;const i=e&&!e.startsWith("/")?"/":"";return`${l}${i}${e||""}`};return{name:"rest",setToken:e=>{s=e},getSession:async()=>{if(!r?.sessionUrl)return s?{token:s}:null;const e=await f(S(r.sessionUrl,r.baseUrl),T({headers:O()}));return e.error?null:e.data},signIn:async e=>{if(!r?.signInUrl)throw new Error("rest: auth.signInUrl not configured");const o=await f(S(r.signInUrl,r.baseUrl),U("POST",e));return o.data?.token&&(s=o.data.token),o},signOut:async()=>(r?.signOutUrl&&await f(S(r.signOutUrl,r.baseUrl),T({method:"POST",headers:O()})),s=null,{error:null}),select:({from:e,params:o,select:l,limit:i,offset:u,order:p,single:y,headers:h,baseUrl:$,responseType:P})=>{const w=N($||t,e||"",G({params:o,select:l,limit:i,offset:u,order:p,single:y})),g=O(h),E=B(g);if(E){const A=T({headers:E.headers});return f(q(w,E.query),A,P,j(()=>w,E.adoptHeaders))}const m=T({headers:g});return f(w,m,P,j(()=>w,m.headers))},rpc:async({from:e,params:o,headers:l,baseUrl:i,responseType:u,read:p})=>{const y=Y(o),h=()=>N(i||t,`rpc/${e}`,o),$=A=>f(S(`rpc/${e}`,i),U("POST",o,l),u,A),P=O(l),w=p===!0&&x&&x.rpc&&y?B(P):null;let g=null;if(w)try{g=h()}catch{g=null}if(!g)return $(b&&b.rpc&&y?j(h,P):null);const E=T({method:"GET",headers:w.headers}),m=await f(q(g,w.query),E,u,j(()=>g,w.adoptHeaders));return m.status===405?$(null):m},insert:({from:e,data:o,headers:l,baseUrl:i,responseType:u})=>f(S(e,i),U("POST",o,l),u),update:({from:e,data:o,params:l,method:i,headers:u,baseUrl:p,responseType:y})=>{const h=l?.id||o?.id,$=h?`${e}/${h}`:e;return f(S($,p),U(i||"PATCH",o,u),y)},upsert:({from:e,data:o,params:l,method:i,headers:u,baseUrl:p,responseType:y})=>{const h=l?.id||o?.id,$=h?`${e}/${h}`:e;return f(S($,p),U(i||"PUT",o,u),y)},delete:({from:e,params:o,headers:l,baseUrl:i,responseType:u})=>{const p=o?.id,y=p?`${e}/${p}`:e;return f(S(y,i),T({method:"DELETE",headers:O(l)}),u)}}};export{N as buildUrl,v as headerEntries,et as restAdapter,G as selectQuery,st as setup,q as withQuery};
1
+ import{openEarly as Y,takeEarly as H,earlyKey as L,isScalarParams as D,withReads as G,queryHeaderEntries as z}from"../early.js";import{requestStarted as M,requestFinished as Q}from"../inflight.js";const _=(t,n,r)=>{const i=n&&!n.startsWith("/")?"/":"",s=new URL(`${t}${i}${n}`);if(r)for(const l in r){const o=r[l];o!=null&&s.searchParams.set(l,typeof o=="object"?JSON.stringify(o):o)}return s.toString()},K=({params:t,select:n,limit:r,offset:i,order:s,single:l})=>{const o={...t};return n&&(o.select=n),r&&(o.limit=r),i&&(o.offset=i),l&&(o.single=!0),s&&(typeof s=="string"?o.order=s:Array.isArray(s)?o.order=s.map(y=>`${y.by}:${y.asc===!1?"desc":"asc"}`).join(","):s.by&&(o.order=`${s.by}:${s.asc===!1?"desc":"asc"}`)),o},J=t=>Object.prototype.toString.call(t).slice(8,-1),F=["auto","json","text","blob","arrayBuffer","stream","response"],V={json:async t=>{const n=await t.text();return n?JSON.parse(n):null},text:t=>t.text(),blob:t=>t.blob(),arrayBuffer:t=>t.arrayBuffer(),stream:t=>t.body,response:t=>t},v=t=>{const n=t.headers.get("content-type");return n&&n.includes("json")?t.json():t.text()},X=async t=>{const n=await t.text(),r=t.headers.get("content-type");if(n&&r&&r.includes("json"))try{return JSON.parse(n)}catch{}return n},I=(t,n)=>t?.message||t?.error||n.statusText||`HTTP ${n.status}`,Z=(t,n)=>{const r=t.body,i=n==="json"||n==="auto"&&/json/i.test(t.type);if(!i&&n!=="auto"&&n!=="text")return null;let s;try{s=i?r?JSON.parse(r):null:r}catch{return!1}return{data:s,error:null,status:t.status}},w=async(t,n,r,i)=>{const s=r??"auto";if(!F.includes(s))throw new TypeError(`@symbo.ls/fetch rest: unknown responseType "${s}" \u2014 use one of: ${F.join(", ")}`);M();try{return await C(t,n,s,i)}finally{Q()}},C=async(t,n,r,i)=>{let s=i?await i:null;if(s&&s.seeded===!0){const o=Z(s,r);if(o)return o;s=o===!1?null:new Response(s.body,{status:s.status,headers:{"content-type":s.type}})}const l=s||await globalThis.fetch(t,n);if(r==="auto"){const o=await v(l);return{data:o,error:l.ok?null:I(o,l),status:l.status}}if(!l.ok){const o=await X(r==="response"?l.clone():l);return{data:r==="response"?l:o,error:I(o,l),status:l.status}}return{data:await V[r](l),error:null,status:l.status}},tt=["FormData","Blob","File","URLSearchParams","ReadableStream","ArrayBuffer"],et=t=>t!==null&&typeof t=="object"&&(ArrayBuffer.isView(t)||tt.includes(J(t))),nt=t=>Array.isArray(t)?t:typeof t.entries=="function"?t.entries():Object.entries(t),B=(...t)=>{const n={},r=new Map;for(const i of t)if(i)for(const[s,l]of nt(i)){const o=s.toLowerCase();if(r.has(o)&&delete n[r.get(o)],l==null){r.delete(o);continue}r.set(o,s),n[s]=l}return n},rt={"Content-Type":"application/json"},st={"Content-Type":void 0},ot=t=>{if(!t||typeof t!="object")return null;const n={};for(const{header:r,param:i}of z(t.query))n[r]=i;return{params:n,rpc:t.rpc==="get"}},at="content-type",W=(t,n)=>{const r=Object.keys(n);if(!r.length)return t;const i=new URL(t);for(const s of r)i.searchParams.set(s,n[s]);return i.toString()},dt=async({url:t,headers:n,auth:r,fetchOptions:i,early:s,reads:l})=>{if(!t)throw new Error("@symbo.ls/fetch rest: url is required");return ct(t,n,r,i,s,l)},ct=(t,n={},r,i={},s,l)=>{let o=r?.token||null;const y=Y(G(s,l),n),j=ot(l),q=e=>{if(!j)return null;const a={},u={},c={};for(const d in e){const p=d.toLowerCase();if(p==="authorization")return null;if(p===at)continue;u[d]=e[d];const f=j.params[p];f?c[f]=e[d]:a[d]=e[d]}return{headers:a,adoptHeaders:u,query:c}},A=(e,a)=>{if(!y)return null;let u="";for(const c in a){const d=c.toLowerCase();if(d==="accept-language")u=String(a[c]);else if(y.carried[d]!==a[c])return null}try{return H(L(e(),u),y.maxAge)}catch{return null}},R=(e,a)=>{if(!y||!y.seeded)return null;let u="";for(const c in a){const d=c.toLowerCase();if(d==="accept-language")u=String(a[c]);else if(d!=="accept")return null}try{return H(L(e,u),y.maxAge)}catch{return null}},N=()=>o?{Authorization:`Bearer ${o}`}:null,U=e=>B(n,N(),e),S=e=>({...i,...e}),m=(e,a,u)=>{if(!et(a))return S({method:e,headers:B(n,N(),rt,u),body:JSON.stringify(a)});const c={method:e,headers:B(n,N(),st,u),body:a};return J(a)==="ReadableStream"&&(c.duplex="half"),S(c)},g=(e,a)=>{const u=a||t;if(e&&(e.startsWith("http://")||e.startsWith("https://")))return e;const c=e&&!e.startsWith("/")?"/":"";return`${u}${c}${e||""}`};return{name:"rest",setToken:e=>{o=e},getSession:async()=>{if(!r?.sessionUrl)return o?{token:o}:null;const e=await w(g(r.sessionUrl,r.baseUrl),S({headers:U()}));return e.error?null:e.data},signIn:async e=>{if(!r?.signInUrl)throw new Error("rest: auth.signInUrl not configured");const a=await w(g(r.signInUrl,r.baseUrl),m("POST",e));return a.data?.token&&(o=a.data.token),a},signOut:async()=>(r?.signOutUrl&&await w(g(r.signOutUrl,r.baseUrl),S({method:"POST",headers:U()})),o=null,{error:null}),select:({from:e,params:a,select:u,limit:c,offset:d,order:p,single:f,headers:b,baseUrl:T,responseType:P})=>{const h=_(T||t,e||"",K({params:a,select:u,limit:c,offset:d,order:p,single:f})),O=U(b),$=q(O);if($){const k=S({headers:$.headers}),x=W(h,$.query);return w(x,k,P,R(x,$.headers)||A(()=>h,$.adoptHeaders))}const E=S({headers:O});return w(h,E,P,R(h,E.headers)||A(()=>h,E.headers))},rpc:async({from:e,params:a,headers:u,baseUrl:c,responseType:d,read:p})=>{const f=D(a),b=()=>_(c||t,`rpc/${e}`,a),T=x=>w(g(`rpc/${e}`,c),m("POST",a,u),d,x),P=U(u),h=p===!0&&j&&j.rpc&&f?q(P):null;let O=null;if(h)try{O=b()}catch{O=null}if(!O)return T(y&&y.rpc&&f?A(b,P):null);const $=S({method:"GET",headers:h.headers}),E=W(O,h.query),k=await w(E,$,d,R(E,h.headers)||A(()=>O,h.adoptHeaders));return k.status===405?T(null):k},insert:({from:e,data:a,headers:u,baseUrl:c,responseType:d})=>w(g(e,c),m("POST",a,u),d),update:({from:e,data:a,params:u,method:c,headers:d,baseUrl:p,responseType:f})=>{const b=u?.id||a?.id,T=b?`${e}/${b}`:e;return w(g(T,p),m(c||"PATCH",a,d),f)},upsert:({from:e,data:a,params:u,method:c,headers:d,baseUrl:p,responseType:f})=>{const b=u?.id||a?.id,T=b?`${e}/${b}`:e;return w(g(T,p),m(c||"PUT",a,d),f)},delete:({from:e,params:a,headers:u,baseUrl:c,responseType:d})=>{const p=a?.id,f=p?`${e}/${p}`:e;return w(g(f,c),S({method:"DELETE",headers:U(u)}),d)}}};export{_ as buildUrl,nt as headerEntries,ct as restAdapter,K as selectQuery,dt as setup,W as withQuery};
package/dist/esm/early.js CHANGED
@@ -1 +1 @@
1
- import{jsonForScript as g}from"@symbo.ls/utils";const b="@symbo.ls/fetch:EARLY",p=3e4,h=(e,n)=>{const r=new URL(e);return r.searchParams.sort(),r.toString()+" "+(n||"")},k=e=>{if(e==null)return!0;if(typeof e!="object"||Array.isArray(e))return!1;const n=Object.getPrototypeOf(e);if(n!==Object.prototype&&n!==null)return!1;for(const r in e){const t=e[r];if(!(t===void 0||typeof t=="string"||typeof t=="boolean")&&!(typeof t=="number"&&isFinite(t)))return!1}return!0},E=(e,n)=>{const r=s=>String(s).split("/").filter(Boolean),t=r(n);let o=null;for(let s=0;s<e.length;s++){const i=r(e[s]),c=i[i.length-1]==="*",a=c?i.length-1:i.length;if(c?t.length<a:t.length!==a)continue;const d={};let u=c?-1:0,f=!0;for(let l=0;l<a;l++)if(i[l].charAt(0)===":"){try{d[i[l].slice(1)]=decodeURIComponent(t[l])}catch{f=!1;break}u+=1}else if(i[l]===t[l])u+=3;else{f=!1;break}f&&(!o||u>o.score)&&(o={index:s,params:d,score:u})}return o&&{index:o.index,params:o.params}},y=()=>Symbol.for(b),m=(e,n)=>{const r=[];for(const t in e||{}){const o=t.toLowerCase(),s={name:t,header:o,param:e[t],found:!1,value:void 0};for(const i in n||{})i.toLowerCase()===o&&(s.found=!0,s.value=n[i]);r.push(s)}return r},w=(e,n)=>{if(!e||typeof e!="object"||!n||typeof n!="object")return e;const r={...e};return r.query===void 0&&n.query!==void 0&&(r.query=n.query),r.rpc===void 0&&n.rpc!==void 0&&(r.rpc=n.rpc),r},j=(e,n)=>{const r=y();if(!e||typeof e!="object"){const s=globalThis[r];return s&&s.seeded?{carried:{},rpc:!1,maxAge:p}:null}globalThis[r]||(globalThis[r]={entries:{}});const t={};for(const{header:s,found:i,value:c}of m(e.query,n))i&&(t[s]=c);const o=typeof e.maxAge=="number"&&e.maxAge>=0?e.maxAge:p;return{carried:t,rpc:e.rpc==="get",maxAge:o}},v=(e,n=p)=>{const r=globalThis[y()],t=r&&r.entries&&r.entries[e];return!t||(delete r.entries[e],!(Date.now()-t.time<=n))?null:Promise.resolve(t.answer).then(o=>o&&o.ok&&!o.bodyUsed?o:null,()=>null)},S=()=>{const e=globalThis[y()];e&&e.entries&&(e.entries={})},R=e=>{const n=(Array.isArray(e)?e:[]).filter(t=>t&&typeof t.url=="string"&&typeof t.body=="string");if(!n.length)return"";const r=g(n.map(t=>({k:h(t.url,t.lang||""),s:t.status||200,t:t.type||"application/json",b:t.body})));return"<script>(function(){try{var k=Symbol.for("+JSON.stringify(b)+"),r=globalThis[k]||(globalThis[k]={entries:{}}),t=Date.now(),l="+r+';r.seeded=true;r.entries=r.entries||{};for(var i=0;i<l.length;i++){var e=l[i];r.entries[e.k]={time:t,answer:Promise.resolve(new Response(e.b,{status:e.s,headers:{"content-type":e.t}}))}}}catch(e){}})()<\/script>'};export{b as EARLY_KEY,p as EARLY_MAX_AGE,R as createEarlySeedScript,S as dropEarly,h as earlyKey,k as isScalarParams,E as matchEarlyRoute,j as openEarly,m as queryHeaderEntries,v as takeEarly,w as withReads};
1
+ import{jsonForScript as g,readJsonDataBlock as m}from"@symbo.ls/utils";const h="@symbo.ls/fetch:EARLY",p=3e4,x=(e,t)=>{const r=new URL(e);return r.searchParams.sort(),r.toString()+" "+(t||"")},S=e=>{if(e==null)return!0;if(typeof e!="object"||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);if(t!==Object.prototype&&t!==null)return!1;for(const r in e){const n=e[r];if(!(n===void 0||typeof n=="string"||typeof n=="boolean")&&!(typeof n=="number"&&isFinite(n)))return!1}return!0},w=(e,t)=>{const r=o=>String(o).split("/").filter(Boolean),n=r(t);let s=null;for(let o=0;o<e.length;o++){const i=r(e[o]),c=i[i.length-1]==="*",f=c?i.length-1:i.length;if(c?n.length<f:n.length!==f)continue;const y={};let a=c?-1:0,d=!0;for(let l=0;l<f;l++)if(i[l].charAt(0)===":"){try{y[i[l].slice(1)]=decodeURIComponent(n[l])}catch{d=!1;break}a+=1}else if(i[l]===n[l])a+=3;else{d=!1;break}d&&(!s||a>s.score)&&(s={index:o,params:y,score:a})}return s&&{index:s.index,params:s.params}},u=()=>Symbol.for(h),k=(e,t)=>{const r=[];for(const n in e||{}){const s=n.toLowerCase(),o={name:n,header:s,param:e[n],found:!1,value:void 0};for(const i in t||{})i.toLowerCase()===s&&(o.found=!0,o.value=t[i]);r.push(o)}return r},T=(e,t)=>{if(!e||typeof e!="object"||!t||typeof t!="object")return e;const r={...e};return r.query===void 0&&t.query!==void 0&&(r.query=t.query),r.rpc===void 0&&t.rpc!==void 0&&(r.rpc=t.rpc),r},L=(e,t)=>{const r=u();if(E(),!e||typeof e!="object"){const o=globalThis[r];return o&&o.seeded?{carried:{},rpc:!1,maxAge:p,seeded:!0}:null}globalThis[r]||(globalThis[r]={entries:{}});const n={};for(const{header:o,found:i,value:c}of k(e.query,t))i&&(n[o]=c);const s=typeof e.maxAge=="number"&&e.maxAge>=0?e.maxAge:p;return{carried:n,rpc:e.rpc==="get",maxAge:s,seeded:!!globalThis[r].seeded}},R=(e,t=p)=>{const r=globalThis[u()],n=r&&r.entries&&r.entries[e];return!n||(delete r.entries[e],!(Date.now()-n.time<=t))?null:n.seeded?Promise.resolve(n.seeded):Promise.resolve(n.answer).then(s=>s&&s.ok&&!s.bodyUsed?s:null,()=>null)},q=()=>{const e=globalThis[u()];e&&e.entries&&(e.entries={})},b=e=>(Array.isArray(e)?e:[]).filter(t=>t&&typeof t.url=="string"&&typeof t.body=="string").map(t=>({k:x(t.url,t.lang||""),s:t.status||200,t:t.type||"application/json",b:t.body})),A='script[type="application/json"][data-fetch-seed]',P=e=>{const t=b(e);return t.length?'<script type="application/json" data-fetch-seed>'+g(t)+"<\/script>":""},E=()=>{const e=m(globalThis.document,A,{remove:!0}),t=e&&e.value;if(!Array.isArray(t)||!t.length)return;const r=u(),n=globalThis[r]||(globalThis[r]={entries:{}});n.entries||(n.entries={}),n.seeded=!0;const s=Date.now();for(const o of t)!o||typeof o.k!="string"||typeof o.b!="string"||n.entries[o.k]||(n.entries[o.k]={time:s,seeded:{seeded:!0,status:o.s||200,type:o.t||"application/json",body:o.b}})},B=e=>{const t=b(e);if(!t.length)return"";const r=g(t);return"<script>(function(){try{var k=Symbol.for("+JSON.stringify(h)+"),r=globalThis[k]||(globalThis[k]={entries:{}}),t=Date.now(),l="+r+';r.seeded=true;r.entries=r.entries||{};for(var i=0;i<l.length;i++){var e=l[i];r.entries[e.k]={time:t,answer:Promise.resolve(new Response(e.b,{status:e.s,headers:{"content-type":e.t}}))}}}catch(e){}})()<\/script>'};export{h as EARLY_KEY,p as EARLY_MAX_AGE,A as SEED_BLOCK,P as createEarlySeedBlock,B as createEarlySeedScript,q as dropEarly,x as earlyKey,S as isScalarParams,w as matchEarlyRoute,L as openEarly,k as queryHeaderEntries,E as readSeedBlock,R as takeEarly,T as withReads};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- import{isArray as I,isFunction as f,isObject as H,isString as he,exec as Ve}from"@symbo.ls/utils";import{createEffect as ht}from"@symbo.ls/signal";import{dropEarly as _t}from"./early.js";const yt=["select","rpc","insert","update","upsert","delete","subscribe"],We={rest:()=>import("./adapters/rest.js"),local:()=>import("./adapters/local.js")},_e=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),X=(()=>{if(typeof globalThis<"u"&&globalThis[_e])return globalThis[_e];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,_e,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[_e]}catch{}return e})(),ye=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),ke=(()=>{if(typeof globalThis<"u"&&globalThis[ye])return globalThis[ye];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ye,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ye]}catch{}return e})(),bt=5e3,St=e=>new Promise(t=>{if(X[e])return t(X[e]);const r=ke[e]||=[];let s=!1;const o=()=>{s||(s=!0,t(X[e]||null))};r.push(o),setTimeout(o,bt)}),It=(e,t)=>{X[e]=t;const r=ke[e];if(r&&r.length){ke[e]=[];for(const s of r)s()}},qt=e=>typeof e=="string"&&!!(X[e]||We[e]),Nt=e=>{const t={};for(const r of yt)e[r]&&(t[r]=e[r]);return t.name=e.name||"custom",t},wt=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...r}=e,s=typeof t=="string"?t:typeof e=="string"?e:null;if(!s)return null;let o=X[s]||We[s];if(!o&&(o=await St(s),!o))throw new Error(`Unknown db adapter: "${s}". Use registerAdapter() for adapters with optional deps.`);const n=await o();if(!n||typeof n.setup!="function")throw new Error(`Adapter "${s}" loader returned a module without a setup() function. Got keys: [${Object.keys(n||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return n.setup(r)},te=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 r=parseInt(t[1]),s=t[2];return s==="ms"?r:s==="s"?r*1e3:s==="m"?r*6e4:s==="h"?r*36e5:0},m=new Map,Y=new Map,q=new Map;let be=0;const Se=new Map,Oe=new WeakMap,Le=(e,t,r,s,o=e.page,n=e.cursor)=>{if(e.cache?.key)return e.cache.key;const{from:i,method:u,infinite:a}=e,l=r?`${r}:`:"",h=s?`:${s}`:"",p=o?":p"+JSON.stringify(o):"",v=n!=null?":c"+JSON.stringify(n):"";return`${i}:${u}:${l}${JSON.stringify(t||"")}${a?":infinite":""}${p}${v}${h}`},re=e=>m.get(e)||null,se=(e,t,r,s=++be,o=!1)=>{const n={data:t,error:r,time:Date.now(),stale:o,seq:s};m.set(e,n);const i=Y.get(e);if(i)for(const u of i)f(u)&&u(n);return n},we=(e,t)=>{const r=e?m.get(e):null;return r&&!r.error&&r.seq>t?r:null},Re=(e,t)=>(Se.get(e)||0)>t,ge=e=>{Se.set(e,++be)},Je=e=>{m.delete(e),ge(e)},Ut=(e,t)=>(Y.has(e)||Y.set(e,new Set),Y.get(e).add(t),()=>{const r=Y.get(e);r&&(r.delete(t),r.size===0&&Y.delete(e))}),Ie=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)}:he(e)?{staleTime:te(e),gcTime:3e5}:{staleTime:te(e.stale||e.staleTime)||6e4,gcTime:te(e.gc||e.gcTime||e.expire)||3e5,key:e.key},B=new Set,He=e=>!!e.ref&&e.element.__ref===e.ref,gt=({config:e,element:t,context:r})=>{try{return Ue(e,t,r)}catch{return null}};let Te=null;const Tt=()=>{Te||(Te=setInterval(()=>{const e=Date.now();for(const[t,r]of m){const s=Y.get(t);!(s&&s.size>0)&&e-r.time>(r.gcTime||3e5)&&m.delete(t)}for(const[t]of Se)!m.has(t)&&!q.has(t)&&Se.delete(t);for(const t of B)He(t)||B.delete(t)},3e4),Te.unref&&Te.unref())};Tt();const Xe=3,qe=e=>Math.min(1e3*2**e,3e4),Ze=(e,t)=>{const r=e.retry;return r===void 0&&t?{count:0}:r===!1?{count:0}:r===!0||r===void 0?{count:Xe,delay:qe}:typeof r=="number"?{count:r,delay:qe}:{count:r.count??Xe,delay:f(r.delay)?r.delay:typeof r.delay=="number"?()=>r.delay:qe}},et=async(e,t)=>{const{count:r,delay:s}=t;let o;for(let n=0;n<=r;n++)try{const i=await e();if(i?.error){if(o=i.error,n<r){const u=f(s)?s(n,o):s;await new Promise(a=>setTimeout(a,u));continue}return i}return i}catch(i){if(o=i,n<r){const u=f(s)?s(n,i):s;await new Promise(a=>setTimeout(a,u));continue}throw i}return{data:null,error:o}},Z={focus:new Set,online:new Set};let tt=!1;const mt=()=>{if(tt||typeof window>"u")return;tt=!0;const e=()=>{for(const r of Z.focus)r()},t=()=>{for(const r of Z.online)r()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},rt=(e,t)=>{const r=t.__ref;if(e===!0)return{from:r.__state||t.key,method:"select",query:!0,on:"create"};if(he(e))return{from:e,method:"select",query:!0,on:"create"};if(H(e)){const s={...e};return s.from=s.from||r.__state||t.key,s.method=s.method||"select",s.on=s.on||"create",s.query===void 0&&(s.query=!0),s}return null},vt=["insert","update","upsert","delete"],st=e=>vt.includes(e),Ne=e=>e.mutation===!0?!0:e.mutation===!1||e.method!=="rpc"?!1:e.on==="submit"||e.on==="click"||e.invalidates!=null,ne=(e,t)=>{const r=e?.state?.root||t?.state?.root;if(r?.lang)return r.lang},me=(e,t)=>{const s=(e?.state?.root||t?.state?.root)?.__fetchScope;return s?String(s):void 0},ve=(e,t,r)=>{let s;if(!e)s=void 0;else if(f(e))s=e(t,t.state);else{s={};for(const o in e){const n=e[o];s[o]=f(n)?n(t,t.state):n}}return s},oe=(e,t)=>f(e)?e(t,t.state):e,Ue=(e,t,r)=>Le(e,ve(e.params,t,r),me(t,r),ne(t,r),oe(e.page,t),oe(e.cursor,t)),Qe=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const r=(s,o)=>{const n=t.state?.root;n?.update&&n.update({auth:{user:s,session:o,loading:!1}})};try{const s=await e.getSession();r(s?.user||null,s)}catch(s){console.warn("[fetch] Failed to restore auth session:",s.message)}e.onAuthStateChange&&e.onAuthStateChange((s,o)=>{r(o?.user||null,o)})},$e=async(e,t)=>{if(f(e.select))return e.auth!==!1&&await Qe(e,t),e;if(e.__resolved)return e.auth!==!1&&await Qe(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=wt(e);const r=await e.__resolving;return delete e.__resolving,r?(r.auth=e.auth,r.url=e.url,r.key=e.key,e.__resolved=r,t.fetch=r,e.auth!==!1&&await Qe(r,t),r):null},F=(e,t,...r)=>{const s=f(e[t])?e[t]:null;s&&s.call(e,...r,e,e.state,e.context)},k=(e,t,r,...s)=>{const o=e&&f(e[r])?e[r]:null;o&&o.call(t,...s,t,t.state,t.context)},ae=e=>{const t={},r=e.node;if(!r)return t;if(r.tagName==="FORM"){const o=new FormData(r);for(const[n,i]of o.entries())t[n]=i;return t}const s=r.querySelectorAll("input, textarea, select");for(let o=0;o<s.length;o++){const n=s[o],i=n.name||n.getAttribute("name");i&&(n.type==="checkbox"?t[i]=n.checked:n.type==="file"?t[i]=n.files:t[i]=n.value)}return t},Ee=e=>e.responseType==="stream"||e.responseType==="response",Et=["Blob","File","ArrayBuffer","ReadableStream","Response"],ze=e=>e!==null&&typeof e=="object"&&(ArrayBuffer.isView(e)||Et.includes(Object.prototype.toString.call(e).slice(8,-1))),N=(e,t,r,s={})=>{if(!r&&ze(t))return;const o=r&&r.startsWith("~/"),n=o&&e.state?.root||e.state;if(n?.update)if(o){const i=r.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&!ze(t)&&i in t?n.update(t,{preventFetch:!0,...s}):n.update({[i]:t},{preventFetch:!0,...s})}else{const i=r?{[r]:t}:t;n.update(i,{preventFetch:!0,...s})}},je=Object.freeze({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),Ke=e=>({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:e,status:"error",fetchStatus:"idle"}),U=(e,t)=>{const r=e?.__ref;r&&(r.__fetchStatus={...t,isError:!!t.error},r.__fetching=t.isFetching,r.__fetchError=t.error)},nt=(e,t,r)=>{const s=e.__pages&&e.__pages.length?e.__pages:[r];f(t.getNextPageParam)&&(e.__nextPageParam=t.getNextPageParam(s[s.length-1],s),e.__hasNextPage=e.__nextPageParam!=null),f(t.getPreviousPageParam)&&(e.__prevPageParam=t.getPreviousPageParam(s[0],s),e.__hasPreviousPage=e.__prevPageParam!=null)},O=async(e,t,r,s={})=>{const o=r?.fetch;if(!o||!t||!t.__ref)return;const n=t.__ref,i=me(t,r);(!n.__fetchScopeOwner||n.__fetchScopeOwner.scope!==i)&&(n.__fetchScopeOwner={scope:i});const u=n.__fetchScopeOwner,a=()=>t.__ref===n&&n.__fetchScopeOwner===u&&me(t,r)===i;if(e.enabled===!1||f(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||f(e.skip)&&e.skip(t,t.state))return;const l=await $e(o,r);if(!l||!a())return;const{from:h,method:p,query:v,params:Pe,cache:Fe,transform:Q,single:ie,auth:ue,fields:G,as:A,limit:$,offset:L,order:S,headers:ee,baseUrl:E,responseType:x,page:g,cursor:P,infinite:z,placeholderData:V,initialData:W,select:T,keepPreviousData:C}=e,j=c=>(f(T)&&(c=T(c,t,t.state)),Q&&(c=Q(c,t,t.state)),c),R=c=>{U(t,Ke(c)),F(t,"onFetchError",c),k(e,t,"onFetchError",c)};let Ae=he(T)?T:void 0;if(v&&f(t.getQuery)){const c=t.getQuery(l.name||"paths");c&&(Ae=c.select||c.length&&c.join(",")||Ae)}const ce=ve(Pe,t,r),D=oe(g,t),Ce=oe(P,t),fe=Ne(e),le=Ee(e)||fe?null:Ie(Fe),lt=Ze(e,fe||st(p)),Ge=ne(t,r),y=le?Le(e,ce,i,Ge,D,Ce):null;if(!n.__fetchInitialized&&y&&(n.__fetchInitialized=!0,W!==void 0)){const c=f(W)?W():W;se(y,c,null)}if((p==="select"||p==="rpc")&&y&&le&&!s.refresh&&!s.force){const c=re(y);if(c&&!c.error){const d=Date.now()-c.time,w=c.stale||d>(le.staleTime||0);z&&I(c.data)&&!n.__pages&&(n.__pages=[c.data],nt(n,e,c.data));const _=j(c.data);if(!a())return;if(!w){U(t,je),N(t,_,A);return}N(t,_,A)}else if(V!==void 0){const d=f(V)?V(t,t.state):V;d!==void 0&&N(t,d,A)}}const de=y&&!s.force?q.get(y):null;if(de&&!Re(y,Oe.get(de)||0)){try{const c=await Promise.race([de,new Promise((d,w)=>setTimeout(()=>w("DEDUP_TIMEOUT"),15e3))]);if(!a())return;if(c?.error)R(c.error);else if(c?.data!==void 0){const d=!z&&we(y,Oe.get(de)||0),w=j(d?d.data:c.data);if(!a())return;N(t,w,A),F(t,"onFetchComplete",w),k(e,t,"onFetchComplete",w)}}catch(c){if(!a())return;c!=="DEDUP_TIMEOUT"&&R(c)}return}const dt=!re(y)?.data;U(t,{isFetching:!0,isLoading:dt,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const M=r?.analyze?.emitNetwork,Me=M?typeof performance<"u"?performance.now():Date.now():0;M&&M({phase:"start",mode:"query",from:h,method:p,cacheKey:y,lang:Ge});const pt=async()=>{if(!a())return;if(ue!==!1&&l.auth!==!1&&l.getSession){const _=await l.getSession();if(!a())return;if(ue===!0&&!_){const b={message:"Not authenticated"};return R(b),{data:null,error:b}}}const c=l[p];if(!f(c))return{data:null,error:{message:`Method "${p}" not found on adapter`}};const d={from:h,select:Ae,params:ce,single:ie,limit:$,offset:L,order:S,headers:ee,baseUrl:E};x!==void 0&&(d.responseType=x);const w=ne(t,r);if(w&&(d.headers={...d.headers,"Accept-Language":w}),D!==void 0){if(H(D))D.offset!==void 0&&(d.offset=D.offset),D.limit!==void 0&&(d.limit=D.limit),D.cursor!==void 0&&(d.params={...d.params,cursor:D.cursor});else if(typeof D=="number"){const _=e.pageSize||$||20;d.offset=(D-1)*_,d.limit=_}}if(Ce!==void 0&&(d.params={...d.params,cursor:Ce}),p==="insert"||p==="update"||p==="upsert"){let _;if(G===!0||e.on==="submit")_=ae(t);else if(I(G)){const b=ae(t);_={};for(const K of G)_[K]=b[K]}else t.state?.parse?_=t.state.parse():H(t.state)&&(_={...t.state});Q&&(_=Q(_,t,t.state)),d.data=_}if(p==="rpc"){let _=ce;if(e.on==="submit"){const b=ae(t);_=e.transformParams?e.transformParams(b,t,t.state):b}d.params=_,d.read=!fe&&e.read!==!1}if(p==="subscribe"){if(f(n.__unsubscribe)){const b=n.__unsubscribe;n.__unsubscribe=null;try{b()}catch{}}const _=l.subscribe({from:h,params:ce,on:e.subscribeOn},(b,K,xe)=>{a()&&(N(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b))});return a()?(n.__unsubscribe=_,{data:null,error:null,subscribed:!0}):(f(_)&&_(),{data:null,error:null,subscribed:!0})}return c(d)},J=++be,pe=et(pt,lt);Oe.set(pe,J),y&&q.set(y,pe);try{const c=await pe;if(fe&&e.invalidates&&c&&!c.error&&!c.subscribed&&at(e.invalidates,h),!a()||c?.subscribed)return;const{data:d,error:w}=c||{};if(w){y&&!we(y,J)&&se(y,null,w,J),R(w),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:w.message||w,durationMs:(typeof performance<"u"?performance.now():Date.now())-Me});return}if(d!==void 0){let _=d;if((p==="select"||p==="rpc")&&y){const K=!z&&we(y,J);if(K)_=K.data;else{const xe=se(y,d,null,J,Re(y,J));xe.gcTime=le?.gcTime||3e5}}let b=_;if(z&&I(d)&&((!n.__pages||!s.direction)&&(n.__pages=[]),s.direction==="previous"?n.__pages.unshift(d):n.__pages.push(d),b=n.__pages.flat(),nt(n,e,d)),b=j(b),!a())return;U(t,je),(!C||b!==void 0)&&N(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b),M&&M({phase:"success",mode:"query",ok:!0,from:h,method:p,cacheKey:y,durationMs:(typeof performance<"u"?performance.now():Date.now())-Me})}}catch(c){if(!a())return;R(c),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:c.message||String(c),durationMs:(typeof performance<"u"?performance.now():Date.now())-Me})}finally{y&&q.get(y)===pe&&q.delete(y)}},Dt=(e,t,r)=>{const s=e.on,o=t.__ref;if(!o)return;o.__fetchListeners||(o.__fetchListeners=[]);const n=e.__runner||O;if(s==="submit"){const i=a=>{a.preventDefault(),n(e,t,r)},u=t.node;u&&(u.addEventListener("submit",i),o.__fetchListeners.push(()=>u.removeEventListener("submit",i)))}else if(s==="click"){const i=()=>n(e,t,r),u=t.node;u&&(u.addEventListener("click",i),o.__fetchListeners.push(()=>u.removeEventListener("click",i)))}else s==="stateChange"&&Pt(e,t,r,n)},Pt=(e,t,r,s)=>{const o=t.__ref;let n;const i=ht(()=>{let u;try{u=JSON.stringify([ve(e.params,t,r)??null,f(e.enabled)?!!e.enabled(t,t.state):e.enabled!==!1,f(e.skip)?!!e.skip(t,t.state):e.skip===!0,oe(e.page,t)??null])}catch{return}if(n===void 0){n=u;return}u!==n&&(n=u,Promise.resolve().then(()=>s(e,t,r)))});Array.isArray(o.__effects)?o.__effects.push(i):o.__fetchListeners.push(()=>i.dispose())},Ft=(e,t,r)=>{const s=t.__ref;s.__fetchCleanups||(s.__fetchCleanups=[]),mt();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:te(o);if(a>0){const l=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&O(e,t,r,{force:!0})},a);s.__fetchCleanups.push(()=>clearInterval(l))}}const n=Ee(e),i=e.refetchOnWindowFocus===void 0?!n:e.refetchOnWindowFocus!==!1,u=e.refetchOnReconnect===void 0?!n:e.refetchOnReconnect!==!1;if(i){const a=()=>{const l=Ue(e,t,r),h=re(l),p=Ie(e.cache);(!h||h.stale||Date.now()-h.time>(p?.staleTime||0))&&O(e,t,r,{force:!0})};Z.focus.add(a),s.__fetchCleanups.push(()=>Z.focus.delete(a))}if(u){const a=()=>O(e,t,r,{force:!0});Z.online.add(a),s.__fetchCleanups.push(()=>Z.online.delete(a))}},At=(e,t,r)=>{if(!t.optimistic)return null;const s=e.__ref,o=t.as,n=e.state?.parse?e.state.parse():H(e.state)?{...e.state}:e.state;s.__optimisticSnapshot=n;const i=f(t.optimistic)?t.optimistic(r,n,e):t.optimistic;return i!==void 0&&N(e,i,o),n},Ye=(e,t)=>{const r=e.__ref;if(!r||!t.optimistic)return;const s=r.__optimisticSnapshot;s!==void 0&&(N(e,s,t.as),delete r.__optimisticSnapshot)},Be=e=>{if(!e)return()=>!0;if(he(e))return t=>t.includes(e);if(I(e)){const t=e.join(":");return r=>r.includes(t)}return e instanceof RegExp?t=>(e.lastIndex=0,e.test(t)):f(e)?t=>{try{return!!e(t)}catch{return!1}}:()=>!1},Ct=e=>{const t=[];for(const r of B){if(!He(r)){B.delete(r);continue}const s=gt(r);s&&e(s)&&t.push(O(r.config,r.element,r.context,{refresh:!0}))}return Promise.allSettled(t).then(()=>{})},ot=e=>{_t();for(const[t,r]of m)e(t)&&(r.stale=!0,ge(t));for(const[t]of q)!m.has(t)&&e(t)&&ge(t);return Ct(e)},at=(e,t)=>{const r=(I(e)?e:[e]).map(s=>s===!0||s==="*"?o=>o.startsWith(t+":"):s?Be(s):()=>!1);return ot(s=>r.some(o=>o(s)))},it=e=>{for(const[t]of m)e(t)&&Je(t);for(const[t]of q)e(t)&&ge(t)},ut=()=>!0,Mt=async(e,t,r)=>{const s=r?.fetch;if(!s)return;const o=await $e(s,r);if(!o)return;const n=t.__ref,{method:i,from:u,fields:a,transform:l,as:h,on:p,auth:v,headers:Pe,baseUrl:Fe,responseType:Q,invalidates:ie,optimistic:ue,onMutate:G,onSuccess:A,onError:$,onSettled:L}=e;let S;if(a===!0||p==="submit")S=ae(t);else if(I(a)){const g=ae(t);S={};for(const P of a)S[P]=g[P]}else t.state?.parse?S=t.state.parse():H(t.state)&&(S={...t.state});l&&(S=l(S,t,t.state)),f(G)&&G(S,t,t.state);const ee=ue?At(t,e,S):null;U(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const E=r?.analyze?.emitNetwork,x=E?typeof performance<"u"?performance.now():Date.now():0;E&&E({phase:"start",mode:"mutation",from:u,method:i});try{if(v!==!1&&o.auth!==!1&&o.getSession){const j=await o.getSession();if(v===!0&&!j){ee!==void 0&&Ye(t,e);const R={message:"Not authenticated"};F(t,"onFetchError",R),k(e,t,"onFetchError",R);return}}const g=o[i];if(!f(g))return;const P={from:u,data:S,headers:Pe,baseUrl:Fe};Q!==void 0&&(P.responseType=Q),e.params&&(P.params=ve(e.params,t,r));const z=ne(t,r);z&&(P.headers={...P.headers,"Accept-Language":z});const V=Ze(e,!0),W=await et(()=>g(P),V),{data:T,error:C}=W||{};if(C){ee!==void 0&&Ye(t,e),U(t,Ke(C)),F(t,"onFetchError",C),f($)&&$(C,S,t),f(L)&&L(null,C,S,t),E&&E({phase:"error",mode:"mutation",from:u,method:i,error:C.message||String(C),durationMs:(typeof performance<"u"?performance.now():Date.now())-x});return}if(delete n.__optimisticSnapshot,U(t,je),T!==void 0&&(h||!ze(T))){const j=h?{[h]:T}:T;t.state?.update&&t.state.update(j,{preventFetch:!0})}F(t,"onFetchComplete",T),k(e,t,"onFetchComplete",T),f(A)&&A(T,S,t),f(L)&&L(T,null,S,t),E&&E({phase:"success",mode:"mutation",ok:!0,from:u,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-x}),ie&&at(ie,u)}catch(g){ee!==void 0&&Ye(t,e),U(t,Ke(g)),F(t,"onFetchError",g),k(e,t,"onFetchError",g),f($)&&$(g,S,t),f(L)&&L(null,g,S,t),E&&E({phase:"error",mode:"mutation",from:u,method:i,error:g.message||String(g),durationMs:(typeof performance<"u"?performance.now():Date.now())-x})}finally{n.__fetching=!1}},kt=e=>{const t=r=>{try{r()}catch{}};for(const r of e.__fetchCleanups||[])t(r);for(const r of e.__fetchListeners||[])t(r);f(e.__unsubscribe)&&t(e.__unsubscribe);for(const r of e.__fetchMounted||[])B.delete(r);e.__fetchCleanups=[],e.__fetchListeners=[],e.__unsubscribe=null,e.__fetchMounted=[]},ct=(e,t,r,s)=>{if(!e||!s?.fetch)return;const n=Ve(e,t);if(!n)return;const i=I(n)?n.map(a=>rt(Ve(a,t),t)).filter(Boolean):[rt(n,t)].filter(Boolean),u=t.__ref;if(u.__fetchMounted)for(const a of u.__fetchMounted)B.delete(a);u.__fetchMounted=[],!u.__fetchDisposer&&I(u.__effects)&&(u.__fetchDisposer={dispose:()=>kt(u)},u.__effects.push(u.__fetchDisposer));for(const a of i){const l=st(a.method),h=l?Mt:O,p=!l&&!Ne(a)&&a.method!=="subscribe";if(a.on==="create"?h(a,t,s):Promise.resolve().then(()=>{Dt({...a,__runner:h},t,s)}),p&&a.on==="create"&&((a.refetchInterval||a.refetchOnWindowFocus!==!1||a.refetchOnReconnect!==!1)&&Ft(a,t,s),!Ee(a))){const v={element:t,ref:u,config:a,context:s};B.add(v),u.__fetchMounted.push(v)}}u.refetch=a=>{for(const l of i)O(l,t,s,{force:!0,...a})},u.fetchNextPage=()=>{const a=i[0];if(!a||!a.infinite)return;const l=u.__nextPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"next",force:!0})},u.fetchPreviousPage=()=>{const a=i[0];if(!a||!a.infinite)return;const l=u.__prevPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"previous",force:!0})}},De={invalidateQueries:e=>ot(Be(e)),removeQueries:e=>{it(e?Be(e):ut)},getQueryData:e=>re(e)?.data??void 0,setQueryData:(e,t)=>{const r=re(e),s=f(t)?t(r?.data):t;se(e,s,null)},prefetchQuery:async(e,t)=>{const r=t?.fetch;if(!r)return;const s=await $e(r,t);if(!s)return;const o=e.method||"select",n=me(null,t),i=ne(null,t),u=Le({...e,method:o},e.params,n,i),a=s[o];if(!f(a))return;const l={from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single,headers:e.headers,baseUrl:e.baseUrl};i&&(l.headers={...l.headers,"Accept-Language":i}),e.responseType!==void 0&&(l.responseType=e.responseType),o==="rpc"&&(l.read=!Ne(e)&&e.read!==!1);const h=++be,p=await a(l);if(p?.data!==void 0&&!p?.error&&!Ee(e)&&!we(u,h)){const v=se(u,p.data,null,h,Re(u,h));v.gcTime=Ie(e.cache)?.gcTime||3e5}return p},getCache:()=>m,clear:()=>it(ut),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[r]of m)r.match(/:([a-z]{2,3})$/i)&&(r.endsWith(t)||Je(r))}},ft=(e,t)=>H(e)?Ue({method:"select",...e},t,t?.context):e,Qt={invalidateQueries(e){return De.invalidateQueries(e)},removeQueries(e){return De.removeQueries(e)},getQueryData(e){return De.getQueryData(ft(e,this))},setQueryData(e,t){return De.setQueryData(ft(e,this),t)}},$t={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||q.clear(),ct(t,e,e.state,e.context))}};import{earlyKey as Yt,EARLY_KEY as Bt,createEarlySeedScript as Gt}from"./early.js";var zt=ct;export{Bt as EARLY_KEY,Nt as createAdapter,Gt as createEarlySeedScript,zt as default,Yt as earlyKey,ct as executeFetch,Qt as fetchFunctions,$t as fetchPlugin,qt as hasAdapter,Qe as initAdapterAuth,te as parseDuration,De as queryClient,It as registerAdapter,wt as resolveDb};
1
+ import{isArray as q,isFunction as f,isObject as H,isString as _e,exec as He}from"@symbo.ls/utils";import{createEffect as yt}from"@symbo.ls/signal";import{dropEarly as bt}from"./early.js";import*as St from"./adapters/rest.js";const wt=["select","rpc","insert","update","upsert","delete","subscribe"],Xe={rest:()=>Promise.resolve(St),local:()=>import("./adapters/local.js")},ye=Symbol.for("@symbo.ls/fetch:CUSTOM_ADAPTERS"),X=(()=>{if(typeof globalThis<"u"&&globalThis[ye])return globalThis[ye];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,ye,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[ye]}catch{}return e})(),be=Symbol.for("@symbo.ls/fetch:PENDING_ADAPTERS"),Oe=(()=>{if(typeof globalThis<"u"&&globalThis[be])return globalThis[be];const e={};if(typeof globalThis<"u")try{return Object.defineProperty(globalThis,be,{value:e,writable:!1,configurable:!1,enumerable:!1}),globalThis[be]}catch{}return e})(),gt=5e3,Tt=e=>new Promise(t=>{if(X[e])return t(X[e]);const r=Oe[e]||=[];let s=!1;const o=()=>{s||(s=!0,t(X[e]||null))};r.push(o),setTimeout(o,gt)}),Ut=(e,t)=>{X[e]=t;const r=Oe[e];if(r&&r.length){Oe[e]=[];for(const s of r)s()}},Qt=e=>typeof e=="string"&&!!(X[e]||Xe[e]),$t=e=>{const t={};for(const r of wt)e[r]&&(t[r]=e[r]);return t.name=e.name||"custom",t},mt=async e=>{if(!e)return null;if(typeof e.select=="function")return e;const{adapter:t,...r}=e,s=typeof t=="string"?t:typeof e=="string"?e:null;if(!s)return null;let o=X[s]||Xe[s];if(!o&&(o=await Tt(s),!o))throw new Error(`Unknown db adapter: "${s}". Use registerAdapter() for adapters with optional deps.`);const n=await o();if(!n||typeof n.setup!="function")throw new Error(`Adapter "${s}" loader returned a module without a setup() function. Got keys: [${Object.keys(n||{}).join(", ")}]. Likely a bundler chunk-resolution issue.`);return n.setup(r)},re=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 r=parseInt(t[1]),s=t[2];return s==="ms"?r:s==="s"?r*1e3:s==="m"?r*6e4:s==="h"?r*36e5:0},m=new Map,x=new Map,I=new Map;let Se=0;const we=new Map,Le=new WeakMap,Re=(e,t,r,s,o=e.page,n=e.cursor)=>{if(e.cache?.key)return e.cache.key;const{from:i,method:u,infinite:a}=e,l=r?`${r}:`:"",h=s?`:${s}`:"",p=o?":p"+JSON.stringify(o):"",v=n!=null?":c"+JSON.stringify(n):"";return`${i}:${u}:${l}${JSON.stringify(t||"")}${a?":infinite":""}${p}${v}${h}`},se=e=>m.get(e)||null,ne=(e,t,r,s=++Se,o=!1)=>{const n={data:t,error:r,time:Date.now(),stale:o,seq:s};m.set(e,n);const i=x.get(e);if(i)for(const u of i)f(u)&&u(n);return n},ge=(e,t)=>{const r=e?m.get(e):null;return r&&!r.error&&r.seq>t?r:null},qe=(e,t)=>(we.get(e)||0)>t,Te=e=>{we.set(e,++Se)},Ze=e=>{m.delete(e),Te(e)},zt=(e,t)=>(x.has(e)||x.set(e,new Set),x.get(e).add(t),()=>{const r=x.get(e);r&&(r.delete(t),r.size===0&&x.delete(e))}),Ie=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)}:_e(e)?{staleTime:re(e),gcTime:3e5}:{staleTime:re(e.stale||e.staleTime)||6e4,gcTime:re(e.gc||e.gcTime||e.expire)||3e5,key:e.key},N=new Set,et=e=>!!e.ref&&e.element.__ref===e.ref,vt=({config:e,element:t,context:r})=>{try{return Qe(e,t,r)}catch{return null}};let me=null;const Et=()=>{me||(me=setInterval(()=>{const e=Date.now();for(const[t,r]of m){const s=x.get(t);!(s&&s.size>0)&&e-r.time>(r.gcTime||3e5)&&m.delete(t)}for(const[t]of we)!m.has(t)&&!I.has(t)&&we.delete(t);for(const t of N)et(t)||N.delete(t)},3e4),me.unref&&me.unref())};Et();const tt=3,Ne=e=>Math.min(1e3*2**e,3e4),rt=(e,t)=>{const r=e.retry;return r===void 0&&t?{count:0}:r===!1?{count:0}:r===!0||r===void 0?{count:tt,delay:Ne}:typeof r=="number"?{count:r,delay:Ne}:{count:r.count??tt,delay:f(r.delay)?r.delay:typeof r.delay=="number"?()=>r.delay:Ne}},st=async(e,t)=>{const{count:r,delay:s}=t;let o;for(let n=0;n<=r;n++)try{const i=await e();if(i?.error){if(o=i.error,n<r){const u=f(s)?s(n,o):s;await new Promise(a=>setTimeout(a,u));continue}return i}return i}catch(i){if(o=i,n<r){const u=f(s)?s(n,i):s;await new Promise(a=>setTimeout(a,u));continue}throw i}return{data:null,error:o}},Z={focus:new Set,online:new Set};let nt=!1;const Dt=()=>{if(nt||typeof window>"u")return;nt=!0;const e=()=>{for(const r of Z.focus)r()},t=()=>{for(const r of Z.online)r()};window.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&e()}),window.addEventListener("focus",e),window.addEventListener("online",t)},ot=(e,t)=>{const r=t.__ref;if(e===!0)return{from:r.__state||t.key,method:"select",query:!0,on:"create"};if(_e(e))return{from:e,method:"select",query:!0,on:"create"};if(H(e)){const s={...e};return s.from=s.from||r.__state||t.key,s.method=s.method||"select",s.on=s.on||"create",s.query===void 0&&(s.query=!0),s}return null},Pt=["insert","update","upsert","delete"],at=e=>Pt.includes(e),Ue=e=>e.mutation===!0?!0:e.mutation===!1||e.method!=="rpc"?!1:e.on==="submit"||e.on==="click"||e.invalidates!=null,oe=(e,t)=>{const r=e?.state?.root||t?.state?.root;if(r?.lang)return r.lang},ve=(e,t)=>{const s=(e?.state?.root||t?.state?.root)?.__fetchScope;return s?String(s):void 0},Ee=(e,t,r)=>{let s;if(!e)s=void 0;else if(f(e))s=e(t,t.state);else{s={};for(const o in e){const n=e[o];s[o]=f(n)?n(t,t.state):n}}return s},ae=(e,t)=>f(e)?e(t,t.state):e,Qe=(e,t,r)=>Re(e,Ee(e.params,t,r),ve(t,r),oe(t,r),ae(e.page,t),ae(e.cursor,t)),$e=async(e,t)=>{if(!e||e.__authInitialized||(e.__authInitialized=!0,!e.getSession))return;const r=(s,o)=>{const n=t.state?.root;n?.update&&n.update({auth:{user:s,session:o,loading:!1}})};try{const s=await e.getSession();r(s?.user||null,s)}catch(s){console.warn("[fetch] Failed to restore auth session:",s.message)}e.onAuthStateChange&&e.onAuthStateChange((s,o)=>{r(o?.user||null,o)})},ze=async(e,t)=>{if(f(e.select))return e.auth!==!1&&await $e(e,t),e;if(e.__resolved)return e.auth!==!1&&await $e(e.__resolved,t),e.__resolved;if(e.__resolving)return e.__resolving;e.__resolving=mt(e);const r=await e.__resolving;return delete e.__resolving,r?(r.auth=e.auth,r.url=e.url,r.key=e.key,e.__resolved=r,t.fetch=r,e.auth!==!1&&await $e(r,t),r):null},F=(e,t,...r)=>{const s=f(e[t])?e[t]:null;s&&s.call(e,...r,e,e.state,e.context)},k=(e,t,r,...s)=>{const o=e&&f(e[r])?e[r]:null;o&&o.call(t,...s,t,t.state,t.context)},ie=e=>{const t={},r=e.node;if(!r)return t;if(r.tagName==="FORM"){const o=new FormData(r);for(const[n,i]of o.entries())t[n]=i;return t}const s=r.querySelectorAll("input, textarea, select");for(let o=0;o<s.length;o++){const n=s[o],i=n.name||n.getAttribute("name");i&&(n.type==="checkbox"?t[i]=n.checked:n.type==="file"?t[i]=n.files:t[i]=n.value)}return t},De=e=>e.responseType==="stream"||e.responseType==="response",Ft=["Blob","File","ArrayBuffer","ReadableStream","Response"],je=e=>e!==null&&typeof e=="object"&&(ArrayBuffer.isView(e)||Ft.includes(Object.prototype.toString.call(e).slice(8,-1))),U=(e,t,r,s={})=>{if(!r&&je(t))return;const o=r&&r.startsWith("~/"),n=o&&e.state?.root||e.state;if(n?.update)if(o){const i=r.slice(2);t&&typeof t=="object"&&!Array.isArray(t)&&!je(t)&&i in t?n.update(t,{preventFetch:!0,...s}):n.update({[i]:t},{preventFetch:!0,...s})}else{const i=r?{[r]:t}:t;n.update(i,{preventFetch:!0,...s})}},Be=Object.freeze({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!0,error:null,status:"success",fetchStatus:"idle"}),Ke=e=>({isFetching:!1,isLoading:!1,isStale:!1,isSuccess:!1,error:e,status:"error",fetchStatus:"idle"}),Q=(e,t)=>{const r=e?.__ref;r&&(r.__fetchStatus={...t,isError:!!t.error},r.__fetching=t.isFetching,r.__fetchError=t.error)},it=(e,t,r)=>{const s=e.__pages&&e.__pages.length?e.__pages:[r];f(t.getNextPageParam)&&(e.__nextPageParam=t.getNextPageParam(s[s.length-1],s),e.__hasNextPage=e.__nextPageParam!=null),f(t.getPreviousPageParam)&&(e.__prevPageParam=t.getPreviousPageParam(s[0],s),e.__hasPreviousPage=e.__prevPageParam!=null)},O=async(e,t,r,s={})=>{const o=r?.fetch;if(!o||!t||!t.__ref)return;const n=t.__ref,i=ve(t,r);(!n.__fetchScopeOwner||n.__fetchScopeOwner.scope!==i)&&(n.__fetchScopeOwner={scope:i});const u=n.__fetchScopeOwner,a=()=>t.__ref===n&&n.__fetchScopeOwner===u&&ve(t,r)===i;if(e.enabled===!1||f(e.enabled)&&!e.enabled(t,t.state)||e.skip===!0||f(e.skip)&&e.skip(t,t.state))return;const l=await ze(o,r);if(!l||!a())return;const{from:h,method:p,query:v,params:Fe,cache:Ae,transform:$,single:ue,auth:ce,fields:Y,as:A,limit:z,offset:L,order:S,headers:te,baseUrl:E,responseType:G,page:g,cursor:P,infinite:j,placeholderData:W,initialData:V,select:T,keepPreviousData:C}=e,B=c=>(f(T)&&(c=T(c,t,t.state)),$&&(c=$(c,t,t.state)),c),R=c=>{Q(t,Ke(c)),F(t,"onFetchError",c),k(e,t,"onFetchError",c)};let Ce=_e(T)?T:void 0;if(v&&f(t.getQuery)){const c=t.getQuery(l.name||"paths");c&&(Ce=c.select||c.length&&c.join(",")||Ce)}const fe=Ee(Fe,t,r),D=ae(g,t),Me=ae(P,t),le=Ue(e),de=De(e)||le?null:Ie(Ae),pt=rt(e,le||at(p)),Ve=oe(t,r),y=de?Re(e,fe,i,Ve,D,Me):null;if(!n.__fetchInitialized&&y&&(n.__fetchInitialized=!0,V!==void 0)){const c=f(V)?V():V;ne(y,c,null)}if((p==="select"||p==="rpc")&&y&&de&&!s.refresh&&!s.force){const c=se(y);if(c&&!c.error){const d=Date.now()-c.time,w=c.stale||d>(de.staleTime||0);j&&q(c.data)&&!n.__pages&&(n.__pages=[c.data],it(n,e,c.data));const _=B(c.data);if(!a())return;if(!w){Q(t,Be),U(t,_,A);return}U(t,_,A)}else if(W!==void 0){const d=f(W)?W(t,t.state):W;d!==void 0&&U(t,d,A)}}const pe=y&&!s.force?I.get(y):null;if(pe&&!qe(y,Le.get(pe)||0)){try{const c=await Promise.race([pe,new Promise((d,w)=>setTimeout(()=>w("DEDUP_TIMEOUT"),15e3))]);if(!a())return;if(c?.error)R(c.error);else if(c?.data!==void 0){const d=!j&&ge(y,Le.get(pe)||0),w=B(d?d.data:c.data);if(!a())return;U(t,w,A),F(t,"onFetchComplete",w),k(e,t,"onFetchComplete",w)}}catch(c){if(!a())return;c!=="DEDUP_TIMEOUT"&&R(c)}return}const ht=!se(y)?.data;Q(t,{isFetching:!0,isLoading:ht,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const M=r?.analyze?.emitNetwork,ke=M?typeof performance<"u"?performance.now():Date.now():0;M&&M({phase:"start",mode:"query",from:h,method:p,cacheKey:y,lang:Ve});const _t=async()=>{if(!a())return;if(ce!==!1&&l.auth!==!1&&l.getSession){const _=await l.getSession();if(!a())return;if(ce===!0&&!_){const b={message:"Not authenticated"};return R(b),{data:null,error:b}}}const c=l[p];if(!f(c))return{data:null,error:{message:`Method "${p}" not found on adapter`}};const d={from:h,select:Ce,params:fe,single:ue,limit:z,offset:L,order:S,headers:te,baseUrl:E};G!==void 0&&(d.responseType=G);const w=oe(t,r);if(w&&(d.headers={...d.headers,"Accept-Language":w}),D!==void 0){if(H(D))D.offset!==void 0&&(d.offset=D.offset),D.limit!==void 0&&(d.limit=D.limit),D.cursor!==void 0&&(d.params={...d.params,cursor:D.cursor});else if(typeof D=="number"){const _=e.pageSize||z||20;d.offset=(D-1)*_,d.limit=_}}if(Me!==void 0&&(d.params={...d.params,cursor:Me}),p==="insert"||p==="update"||p==="upsert"){let _;if(Y===!0||e.on==="submit")_=ie(t);else if(q(Y)){const b=ie(t);_={};for(const K of Y)_[K]=b[K]}else t.state?.parse?_=t.state.parse():H(t.state)&&(_={...t.state});$&&(_=$(_,t,t.state)),d.data=_}if(p==="rpc"){let _=fe;if(e.on==="submit"){const b=ie(t);_=e.transformParams?e.transformParams(b,t,t.state):b}d.params=_,d.read=!le&&e.read!==!1}if(p==="subscribe"){if(f(n.__unsubscribe)){const b=n.__unsubscribe;n.__unsubscribe=null;try{b()}catch{}}const _=l.subscribe({from:h,params:fe,on:e.subscribeOn},(b,K,Je)=>{a()&&(U(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b))});return a()?(n.__unsubscribe=_,{data:null,error:null,subscribed:!0}):(f(_)&&_(),{data:null,error:null,subscribed:!0})}return c(d)},J=++Se,he=st(_t,pt);Le.set(he,J),y&&I.set(y,he);try{const c=await he;if(le&&e.invalidates&&c&&!c.error&&!c.subscribed&&ct(e.invalidates,h),!a()||c?.subscribed)return;const{data:d,error:w}=c||{};if(w){y&&!ge(y,J)&&ne(y,null,w,J),R(w),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:w.message||w,durationMs:(typeof performance<"u"?performance.now():Date.now())-ke});return}if(d!==void 0){let _=d;if((p==="select"||p==="rpc")&&y){const K=!j&&ge(y,J);if(K)_=K.data;else{const Je=ne(y,d,null,J,qe(y,J));Je.gcTime=de?.gcTime||3e5}}let b=_;if(j&&q(d)&&((!n.__pages||!s.direction)&&(n.__pages=[]),s.direction==="previous"?n.__pages.unshift(d):n.__pages.push(d),b=n.__pages.flat(),it(n,e,d)),b=B(b),!a())return;Q(t,Be),(!C||b!==void 0)&&U(t,b,A),F(t,"onFetchComplete",b),k(e,t,"onFetchComplete",b),M&&M({phase:"success",mode:"query",ok:!0,from:h,method:p,cacheKey:y,durationMs:(typeof performance<"u"?performance.now():Date.now())-ke})}}catch(c){if(!a())return;R(c),M&&M({phase:"error",mode:"query",from:h,method:p,cacheKey:y,error:c.message||String(c),durationMs:(typeof performance<"u"?performance.now():Date.now())-ke})}finally{y&&I.get(y)===he&&I.delete(y)}},At=(e,t,r)=>{const s=e.on,o=t.__ref;if(!o)return;o.__fetchListeners||(o.__fetchListeners=[]);const n=e.__runner||O;if(s==="submit"){const i=a=>{a.preventDefault(),n(e,t,r)},u=t.node;u&&(u.addEventListener("submit",i),o.__fetchListeners.push(()=>u.removeEventListener("submit",i)))}else if(s==="click"){const i=()=>n(e,t,r),u=t.node;u&&(u.addEventListener("click",i),o.__fetchListeners.push(()=>u.removeEventListener("click",i)))}else s==="stateChange"&&Ct(e,t,r,n)},Ct=(e,t,r,s)=>{const o=t.__ref;let n;const i=yt(()=>{let u;try{u=JSON.stringify([Ee(e.params,t,r)??null,f(e.enabled)?!!e.enabled(t,t.state):e.enabled!==!1,f(e.skip)?!!e.skip(t,t.state):e.skip===!0,ae(e.page,t)??null])}catch{return}if(n===void 0){n=u;return}u!==n&&(n=u,queueMicrotask(()=>s(e,t,r)))});Array.isArray(o.__effects)?o.__effects.push(i):o.__fetchListeners.push(()=>i.dispose())},Mt=(e,t,r)=>{const s=t.__ref;s.__fetchCleanups||(s.__fetchCleanups=[]),Dt();const o=e.refetchInterval;if(o){const a=typeof o=="number"?o:re(o);if(a>0){const l=setInterval(()=>{(e.refetchIntervalInBackground||typeof document>"u"||document.visibilityState==="visible")&&O(e,t,r,{force:!0})},a);s.__fetchCleanups.push(()=>clearInterval(l))}}const n=De(e),i=e.refetchOnWindowFocus===void 0?!n:e.refetchOnWindowFocus!==!1,u=e.refetchOnReconnect===void 0?!n:e.refetchOnReconnect!==!1;if(i){const a=()=>{const l=Qe(e,t,r),h=se(l),p=Ie(e.cache);(!h||h.stale||Date.now()-h.time>(p?.staleTime||0))&&O(e,t,r,{force:!0})};Z.focus.add(a),s.__fetchCleanups.push(()=>Z.focus.delete(a))}if(u){const a=()=>O(e,t,r,{force:!0});Z.online.add(a),s.__fetchCleanups.push(()=>Z.online.delete(a))}},kt=(e,t,r)=>{if(!t.optimistic)return null;const s=e.__ref,o=t.as,n=e.state?.parse?e.state.parse():H(e.state)?{...e.state}:e.state;s.__optimisticSnapshot=n;const i=f(t.optimistic)?t.optimistic(r,n,e):t.optimistic;return i!==void 0&&U(e,i,o),n},xe=(e,t)=>{const r=e.__ref;if(!r||!t.optimistic)return;const s=r.__optimisticSnapshot;s!==void 0&&(U(e,s,t.as),delete r.__optimisticSnapshot)},Ye=e=>{if(!e)return()=>!0;if(_e(e))return t=>t.includes(e);if(q(e)){const t=e.join(":");return r=>r.includes(t)}return e instanceof RegExp?t=>(e.lastIndex=0,e.test(t)):f(e)?t=>{try{return!!e(t)}catch{return!1}}:()=>!1},Ot=e=>{const t=[];for(const r of N){if(!et(r)){N.delete(r);continue}const s=vt(r);s&&e(s)&&t.push(O(r.config,r.element,r.context,{refresh:!0}))}return Promise.allSettled(t).then(()=>{})},ut=e=>{bt();for(const[t,r]of m)e(t)&&(r.stale=!0,Te(t));for(const[t]of I)!m.has(t)&&e(t)&&Te(t);return Ot(e)},ct=(e,t)=>{const r=(q(e)?e:[e]).map(s=>s===!0||s==="*"?o=>o.startsWith(t+":"):s?Ye(s):()=>!1);return ut(s=>r.some(o=>o(s)))},Ge=e=>{for(const[t]of m)e(t)&&Ze(t);for(const[t]of I)e(t)&&Te(t)},We=()=>!0,ft=new WeakSet,ee=e=>{!e||!e.isolateFetchCache||ft.has(e)||(ft.add(e),Ge(We),N.clear())},Lt=async(e,t,r)=>{const s=r?.fetch;if(!s)return;const o=await ze(s,r);if(!o)return;const n=t.__ref,{method:i,from:u,fields:a,transform:l,as:h,on:p,auth:v,headers:Fe,baseUrl:Ae,responseType:$,invalidates:ue,optimistic:ce,onMutate:Y,onSuccess:A,onError:z,onSettled:L}=e;let S;if(a===!0||p==="submit")S=ie(t);else if(q(a)){const g=ie(t);S={};for(const P of a)S[P]=g[P]}else t.state?.parse?S=t.state.parse():H(t.state)&&(S={...t.state});l&&(S=l(S,t,t.state)),f(Y)&&Y(S,t,t.state);const te=ce?kt(t,e,S):null;Q(t,{isFetching:!0,isLoading:!1,isStale:!1,isSuccess:!1,error:null,status:"pending",fetchStatus:"fetching"}),F(t,"onFetchStart"),k(e,t,"onFetchStart");const E=r?.analyze?.emitNetwork,G=E?typeof performance<"u"?performance.now():Date.now():0;E&&E({phase:"start",mode:"mutation",from:u,method:i});try{if(v!==!1&&o.auth!==!1&&o.getSession){const B=await o.getSession();if(v===!0&&!B){te!==void 0&&xe(t,e);const R={message:"Not authenticated"};F(t,"onFetchError",R),k(e,t,"onFetchError",R);return}}const g=o[i];if(!f(g))return;const P={from:u,data:S,headers:Fe,baseUrl:Ae};$!==void 0&&(P.responseType=$),e.params&&(P.params=Ee(e.params,t,r));const j=oe(t,r);j&&(P.headers={...P.headers,"Accept-Language":j});const W=rt(e,!0),V=await st(()=>g(P),W),{data:T,error:C}=V||{};if(C){te!==void 0&&xe(t,e),Q(t,Ke(C)),F(t,"onFetchError",C),f(z)&&z(C,S,t),f(L)&&L(null,C,S,t),E&&E({phase:"error",mode:"mutation",from:u,method:i,error:C.message||String(C),durationMs:(typeof performance<"u"?performance.now():Date.now())-G});return}if(delete n.__optimisticSnapshot,Q(t,Be),T!==void 0&&(h||!je(T))){const B=h?{[h]:T}:T;t.state?.update&&t.state.update(B,{preventFetch:!0})}F(t,"onFetchComplete",T),k(e,t,"onFetchComplete",T),f(A)&&A(T,S,t),f(L)&&L(T,null,S,t),E&&E({phase:"success",mode:"mutation",ok:!0,from:u,method:i,durationMs:(typeof performance<"u"?performance.now():Date.now())-G}),ue&&ct(ue,u)}catch(g){te!==void 0&&xe(t,e),Q(t,Ke(g)),F(t,"onFetchError",g),k(e,t,"onFetchError",g),f(z)&&z(g,S,t),f(L)&&L(null,g,S,t),E&&E({phase:"error",mode:"mutation",from:u,method:i,error:g.message||String(g),durationMs:(typeof performance<"u"?performance.now():Date.now())-G})}finally{n.__fetching=!1}},Rt=e=>{const t=r=>{try{r()}catch{}};for(const r of e.__fetchCleanups||[])t(r);for(const r of e.__fetchListeners||[])t(r);f(e.__unsubscribe)&&t(e.__unsubscribe);for(const r of e.__fetchMounted||[])N.delete(r);e.__fetchCleanups=[],e.__fetchListeners=[],e.__unsubscribe=null,e.__fetchMounted=[]},lt=(e,t,r,s)=>{if(!e||!s?.fetch)return;ee(s);const n=He(e,t);if(!n)return;const i=q(n)?n.map(a=>ot(He(a,t),t)).filter(Boolean):[ot(n,t)].filter(Boolean),u=t.__ref;if(u.__fetchMounted)for(const a of u.__fetchMounted)N.delete(a);u.__fetchMounted=[],!u.__fetchDisposer&&q(u.__effects)&&(u.__fetchDisposer={dispose:()=>Rt(u)},u.__effects.push(u.__fetchDisposer));for(const a of i){const l=at(a.method),h=l?Lt:O,p=!l&&!Ue(a)&&a.method!=="subscribe";if(a.on==="create"?h(a,t,s):queueMicrotask(()=>At({...a,__runner:h},t,s)),p&&a.on==="create"&&((a.refetchInterval||a.refetchOnWindowFocus!==!1||a.refetchOnReconnect!==!1)&&Mt(a,t,s),!De(a))){const v={element:t,ref:u,config:a,context:s};N.add(v),u.__fetchMounted.push(v)}}u.refetch=a=>{for(const l of i)O(l,t,s,{force:!0,...a})},u.fetchNextPage=()=>{const a=i[0];if(!a||!a.infinite)return;const l=u.__nextPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"next",force:!0})},u.fetchPreviousPage=()=>{const a=i[0];if(!a||!a.infinite)return;const l=u.__prevPageParam;if(l==null)return;const h={...a,cursor:l};O(h,t,s,{direction:"previous",force:!0})}},Pe={invalidateQueries:e=>ut(Ye(e)),removeQueries:e=>{Ge(e?Ye(e):We)},getQueryData:e=>se(e)?.data??void 0,setQueryData:(e,t)=>{const r=se(e),s=f(t)?t(r?.data):t;ne(e,s,null)},prefetchQuery:async(e,t)=>{const r=t?.fetch;if(!r)return;ee(t);const s=await ze(r,t);if(!s)return;const o=e.method||"select",n=ve(null,t),i=oe(null,t),u=Re({...e,method:o},e.params,n,i),a=s[o];if(!f(a))return;const l={from:e.from,params:e.params,limit:e.limit,offset:e.offset,order:e.order,single:e.single,headers:e.headers,baseUrl:e.baseUrl};i&&(l.headers={...l.headers,"Accept-Language":i}),e.responseType!==void 0&&(l.responseType=e.responseType),o==="rpc"&&(l.read=!Ue(e)&&e.read!==!1);const h=++Se,p=await a(l);if(p?.data!==void 0&&!p?.error&&!De(e)&&!ge(u,h)){const v=ne(u,p.data,null,h,qe(u,h));v.gcTime=Ie(e.cache)?.gcTime||3e5}return p},getCache:()=>m,clear:()=>Ge(We),dropNonLang:e=>{if(!e)return;const t=`:${e}`;for(const[r]of m)r.match(/:([a-z]{2,3})$/i)&&(r.endsWith(t)||Ze(r))}},dt=(e,t)=>H(e)?Qe({method:"select",...e},t,t?.context):e,jt={invalidateQueries(e){return ee(this?.context),Pe.invalidateQueries(e)},removeQueries(e){return ee(this?.context),Pe.removeQueries(e)},getQueryData(e){return ee(this?.context),Pe.getQueryData(dt(e,this))},setQueryData(e,t){return ee(this?.context),Pe.setQueryData(dt(e,this),t)}},Bt={name:"fetch",create(e){const t=e.fetch;t&&(e.parent||I.clear(),lt(t,e,e.state,e.context))}};import{earlyKey as Gt,EARLY_KEY as Wt,createEarlySeedScript as Vt,createEarlySeedBlock as Jt,SEED_BLOCK as Ht}from"./early.js";import{requestsInFlight as Zt,whenRequestsIdle as er}from"./inflight.js";var Kt=lt;export{Wt as EARLY_KEY,Ht as SEED_BLOCK,$t as createAdapter,Jt as createEarlySeedBlock,Vt as createEarlySeedScript,Kt as default,Gt as earlyKey,lt as executeFetch,jt as fetchFunctions,Bt as fetchPlugin,Qt as hasAdapter,$e as initAdapterAuth,re as parseDuration,Pe as queryClient,Ut as registerAdapter,Zt as requestsInFlight,mt as resolveDb,er as whenRequestsIdle};
@@ -0,0 +1 @@
1
+ const o=Symbol.for("@symbo.ls/fetch:IN_FLIGHT"),s=()=>globalThis[o]||(globalThis[o]={count:0,waiters:[]}),r=()=>{s().count++},c=()=>{const t=s();if(t.count=t.count>0?t.count-1:0,t.count===0&&t.waiters.length){const e=t.waiters;t.waiters=[];for(const n of e)n()}},i=()=>s().count,u=()=>{const t=s();return t.count===0?Promise.resolve():new Promise(e=>{t.waiters.push(e)})};export{c as requestFinished,r as requestStarted,i as requestsInFlight,u as whenRequestsIdle};
package/early.js CHANGED
@@ -24,7 +24,7 @@
24
24
  // self-contained: no reference to anything outside their own parameters and
25
25
  // the platform's built-ins (URL, decodeURIComponent, …).
26
26
 
27
- import { jsonForScript } from '@symbo.ls/utils'
27
+ import { jsonForScript, readJsonDataBlock } from '@symbo.ls/utils'
28
28
 
29
29
  export const EARLY_KEY = '@symbo.ls/fetch:EARLY'
30
30
 
@@ -144,14 +144,17 @@ export const withReads = (early, reads) => {
144
144
  // No `early` config → null, and the adapter never looks (the opt-in).
145
145
  export const openEarly = (config, headers) => {
146
146
  const key = registryKey()
147
+ // The page's seed block, if it carries one, fills the registry first.
148
+ readSeedBlock()
147
149
  if (!config || typeof config !== 'object') {
148
- // A server-seeded registry (createEarlySeedScript: the answers a
149
- // brender pre-render already got) is adoptable without `fetch.early`:
150
- // the page carries the answers, nothing is sent early. Only a call with
151
- // no header beyond Accept-Language can take one — exactly what the
152
- // server recorded (an anonymous GET).
150
+ // A server-seeded registry (the answers a brender pre-render already
151
+ // got: createEarlySeedBlock, or an older page's createEarlySeedScript)
152
+ // is adoptable without `fetch.early`: the page carries the answers,
153
+ // nothing is sent early. Only a call that sends exactly what the server
154
+ // recorded — an anonymous GET, no header beyond Accept-Language — can
155
+ // take one.
153
156
  const seeded = globalThis[key]
154
- if (seeded && seeded.seeded) return { carried: {}, rpc: false, maxAge: EARLY_MAX_AGE }
157
+ if (seeded && seeded.seeded) return { carried: {}, rpc: false, maxAge: EARLY_MAX_AGE, seeded: true }
155
158
  return null
156
159
  }
157
160
  // Any registry closes the hand-off: the pre-boot script sends nothing once
@@ -162,7 +165,7 @@ export const openEarly = (config, headers) => {
162
165
  if (found) carried[header] = value
163
166
  }
164
167
  const maxAge = typeof config.maxAge === 'number' && config.maxAge >= 0 ? config.maxAge : EARLY_MAX_AGE
165
- return { carried, rpc: config.rpc === 'get', maxAge }
168
+ return { carried, rpc: config.rpc === 'get', maxAge, seeded: !!globalThis[key].seeded }
166
169
  }
167
170
 
168
171
  // The waiting answer for `key`, taken ONCE (a body can be read once; a second
@@ -170,12 +173,18 @@ export const openEarly = (config, headers) => {
170
173
  // the early request failed, was refused (a 4xx/5xx may be the early form's
171
174
  // own problem — a query-string key or a GET the backend does not serve — so
172
175
  // the call's own request decides), or is older than `maxAge`.
176
+ //
177
+ // A seed block's answer (readSeedBlock) resolves to the answer itself —
178
+ // `{ seeded: true, status, type, body }`, always an ok one — which the REST
179
+ // adapter reads without a Response: no body stream, so the data lands in the
180
+ // same task the app booted in, before the first frame paints.
173
181
  export const takeEarly = (key, maxAge = EARLY_MAX_AGE) => {
174
182
  const registry = globalThis[registryKey()]
175
183
  const entry = registry && registry.entries && registry.entries[key]
176
184
  if (!entry) return null
177
185
  delete registry.entries[key]
178
186
  if (!(Date.now() - entry.time <= maxAge)) return null
187
+ if (entry.seeded) return Promise.resolve(entry.seeded)
179
188
  return Promise.resolve(entry.answer).then(
180
189
  (res) => (res && res.ok && !res.bodyUsed ? res : null),
181
190
  () => null
@@ -191,23 +200,60 @@ export const dropEarly = () => {
191
200
 
192
201
  // --- Server-seeded answers (FW-BRENDER-HYDRATION-AND-CF-DEPLOY-PROVIDER-1) ---
193
202
  // A @symbo.ls/brender pre-render records the anonymous GETs its fetch
194
- // adapter made (url, Accept-Language, status, content type, body). The page
195
- // carries them as this script, which runs before the app and fills the same
196
- // registry a `fetch.early` pre-boot script fills — keyed with earlyKey, so
197
- // the REST adapter adopts each answer for the first call that asks for
198
- // exactly that request instead of asking the network again. Marked
199
- // `seeded`, so an adapter without `fetch.early` adopts them too (openEarly).
200
- // `entries`: [{ url, lang, status, type, body }]. JSON is embedded with
201
- // utils jsonForScript, so a body can never close the <script>.
203
+ // adapter made (url as sent, Accept-Language, status, content type, body).
204
+ // The page carries them, and they fill the same registry a `fetch.early`
205
+ // pre-boot script fills — keyed with earlyKey, so the REST adapter adopts
206
+ // each answer for the first call that sends exactly that request instead of
207
+ // asking the network again. Marked `seeded`, so an adapter without
208
+ // `fetch.early` adopts them too (openEarly).
209
+ // `entries`: [{ url, lang, status, type, body }].
210
+
211
+ // The recorded answers as the page carries them: `{ k: earlyKey, s: status,
212
+ // t: content type, b: body }`.
213
+ const seedList = (entries) => (Array.isArray(entries) ? entries : [])
214
+ .filter((e) => e && typeof e.url === 'string' && typeof e.body === 'string')
215
+ .map((e) => ({ k: earlyKey(e.url, e.lang || ''), s: e.status || 200, t: e.type || 'application/json', b: e.body }))
216
+
217
+ // The page's answers as a data block — `<script type="application/json"
218
+ // data-fetch-seed>` — which no Content-Security-Policy blocks: XMA's
219
+ // `script-src 'self'` (no 'unsafe-inline') refused the inline
220
+ // createEarlySeedScript below, so a pre-rendered page under it had no seed
221
+ // (XMA report, brender items 1 and 3). The REST adapter reads the block when
222
+ // it opens (readSeedBlock). JSON is embedded with utils jsonForScript, so a
223
+ // body can never close the block.
224
+ export const SEED_BLOCK = 'script[type="application/json"][data-fetch-seed]'
225
+
226
+ export const createEarlySeedBlock = (entries) => {
227
+ const list = seedList(entries)
228
+ if (!list.length) return ''
229
+ return '<script type="application/json" data-fetch-seed>' + jsonForScript(list) + '</script>'
230
+ }
231
+
232
+ // Fill the registry from the page's seed block — once: the block goes when
233
+ // read. An answer already waiting under the same key (a pre-boot script's)
234
+ // is kept. Each seeded answer is adoptable for EARLY_MAX_AGE from now.
235
+ export const readSeedBlock = () => {
236
+ const read = readJsonDataBlock(globalThis.document, SEED_BLOCK, { remove: true })
237
+ const list = read && read.value
238
+ if (!Array.isArray(list) || !list.length) return
239
+ const key = registryKey()
240
+ const registry = globalThis[key] || (globalThis[key] = { entries: {} })
241
+ if (!registry.entries) registry.entries = {}
242
+ registry.seeded = true
243
+ const time = Date.now()
244
+ for (const e of list) {
245
+ if (!e || typeof e.k !== 'string' || typeof e.b !== 'string' || registry.entries[e.k]) continue
246
+ registry.entries[e.k] = { time, seeded: { seeded: true, status: e.s || 200, type: e.t || 'application/json', body: e.b } }
247
+ }
248
+ }
249
+
250
+ // The same answers as an inline script (pages from brender up to 3.14.664;
251
+ // the platform's renderer still ships it). Kept for those: a page under a
252
+ // strict Content-Security-Policy needs createEarlySeedBlock.
202
253
  export const createEarlySeedScript = (entries) => {
203
- const list = (Array.isArray(entries) ? entries : []).filter((e) => e && typeof e.url === 'string' && typeof e.body === 'string')
254
+ const list = seedList(entries)
204
255
  if (!list.length) return ''
205
- const json = jsonForScript(list.map((e) => ({
206
- k: earlyKey(e.url, e.lang || ''),
207
- s: e.status || 200,
208
- t: e.type || 'application/json',
209
- b: e.body
210
- })))
256
+ const json = jsonForScript(list)
211
257
  return '<script>(function(){try{var k=Symbol.for(' + JSON.stringify(EARLY_KEY) + '),' +
212
258
  'r=globalThis[k]||(globalThis[k]={entries:{}}),t=Date.now(),l=' + json + ';' +
213
259
  'r.seeded=true;r.entries=r.entries||{};' +
package/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  import { isArray, isFunction, isObject, isString, exec } from '@symbo.ls/utils'
4
4
  import { createEffect } from '@symbo.ls/signal'
5
5
  import { dropEarly } from './early.js'
6
+ import * as restAdapter from './adapters/rest.js'
6
7
 
7
8
  // --- Adapter resolution ---
8
9
 
@@ -32,8 +33,24 @@ const ADAPTER_METHODS = ['select', 'rpc', 'insert', 'update', 'upsert', 'delete'
32
33
  // declaration silently dies (SMBLS-FETCH-RESOLVEDB-EMPTY-RESULT-1).
33
34
  // Keeping these local is safe because every copy of this file ships
34
35
  // its own adapters/ chunks; the imports always resolve in-bundle.
36
+ //
37
+ // The REST adapter ships WITH the plugin, not as a lazy file: an app with
38
+ // `fetch` reads its first data through it, and as a file of its own it was
39
+ // the third load in a row before that first read — in smbls/core's split
40
+ // build: the plugin (7.8 KB gzip), then the early/in-flight code the plugin
41
+ // shared with the adapter (1.5 KB), then the adapter (2.7 KB) on the first
42
+ // resolveDb. Static here, the three are one file.
43
+ //
44
+ // `local` stays a lazy file: an app that never configures it never loads it.
45
+ // That is also why every microtask in this module is queued with
46
+ // queueMicrotask, never `Promise.resolve().then(fn)`: parcel 2 (the bundler
47
+ // `smbls build` runs) rewrites the first such call after an `import()` in a
48
+ // file into `Promise.resolve().then(() => <that import>).then(fn)`, and this
49
+ // `import()` comes first in the file. The `on: 'stateChange'` run loaded the
50
+ // local adapter that way on XMA's first "Show more" click (xma.info,
51
+ // 2026-10-16). __tests__/localAdapterStaysLazy.test.js holds the rule.
35
52
  const BUILTIN_ADAPTERS = {
36
- rest: () => import('./adapters/rest.js'),
53
+ rest: () => Promise.resolve(restAdapter),
37
54
  local: () => import('./adapters/local.js')
38
55
  }
39
56
 
@@ -1157,8 +1174,8 @@ const bindStateChange = (config, element, context, runner) => {
1157
1174
  if (inputs === last) return
1158
1175
  last = inputs
1159
1176
  // Outside the effect: the run reads state as well, and none of that may
1160
- // become the effect's dependency.
1161
- Promise.resolve().then(() => runner(config, element, context))
1177
+ // become the effect's dependency. (queueMicrotask: see BUILTIN_ADAPTERS.)
1178
+ queueMicrotask(() => runner(config, element, context))
1162
1179
  })
1163
1180
  if (Array.isArray(ref.__effects)) ref.__effects.push(effect)
1164
1181
  else ref.__fetchListeners.push(() => effect.dispose())
@@ -1339,6 +1356,28 @@ const removeMatching = (matches) => {
1339
1356
 
1340
1357
  const ALL_KEYS = () => true
1341
1358
 
1359
+ // --- One query cache per server render ---
1360
+ //
1361
+ // The cache lives as long as this module: in a browser, the page. A server
1362
+ // renderer (@symbo.ls/brender) renders page after page in ONE module
1363
+ // instance — every route of `smbls build`, every request of a worker isolate
1364
+ // — and a page answered from the rows an earlier page left made no request:
1365
+ // nothing for that page's fetch seed (the browser asked again right after
1366
+ // boot; xma.info, 2026-10-16), and in an isolate serving several projects,
1367
+ // another project's rows under the same key. A context that sets
1368
+ // `isolateFetchCache` (brender sets it on every render) starts from an empty
1369
+ // cache: the first query it runs drops every entry an earlier context left,
1370
+ // marks the requests still out as outdated (never shared with it, never
1371
+ // written back as fresh) and forgets the queries mounted before it (an
1372
+ // invalidation it makes refetches its own). A browser context never sets it.
1373
+ const isolatedContexts = new WeakSet()
1374
+ const enterContext = (context) => {
1375
+ if (!context || !context.isolateFetchCache || isolatedContexts.has(context)) return
1376
+ isolatedContexts.add(context)
1377
+ removeMatching(ALL_KEYS)
1378
+ mountedQueries.clear()
1379
+ }
1380
+
1342
1381
  // --- Mutation runner (insert/update/delete with optimistic + invalidation) ---
1343
1382
 
1344
1383
  const runMutation = async (config, element, context) => {
@@ -1487,6 +1526,7 @@ export const executeFetch = (param, element, state, context) => {
1487
1526
  if (!param) return
1488
1527
  const db = context?.fetch
1489
1528
  if (!db) return
1529
+ enterContext(context)
1490
1530
 
1491
1531
  const fetchProp = exec(param, element)
1492
1532
  if (!fetchProp) return
@@ -1525,9 +1565,8 @@ export const executeFetch = (param, element, state, context) => {
1525
1565
  if (config.on === 'create') {
1526
1566
  runner(config, element, context)
1527
1567
  } else {
1528
- Promise.resolve().then(() => {
1529
- bindEvent({ ...config, __runner: runner }, element, context)
1530
- })
1568
+ // (queueMicrotask: see BUILTIN_ADAPTERS.)
1569
+ queueMicrotask(() => bindEvent({ ...config, __runner: runner }, element, context))
1531
1570
  }
1532
1571
 
1533
1572
  // Bind auto-refetch for queries
@@ -1599,6 +1638,7 @@ export const queryClient = {
1599
1638
  prefetchQuery: async (config, context) => {
1600
1639
  const db = context?.fetch
1601
1640
  if (!db) return
1641
+ enterContext(context)
1602
1642
 
1603
1643
  const adapter = await resolveAdapter(db, context)
1604
1644
  if (!adapter) return
@@ -1684,11 +1724,13 @@ const keyFor = (keyOrConfig, element) => {
1684
1724
  return elementQueryKey({ method: 'select', ...keyOrConfig }, element, element?.context)
1685
1725
  }
1686
1726
 
1727
+ // Each enters the caller's context first, as a query does (enterContext): rows
1728
+ // a server render's project code writes before its first query stay its own.
1687
1729
  export const fetchFunctions = {
1688
- invalidateQueries (keyOrPattern) { return queryClient.invalidateQueries(keyOrPattern) },
1689
- removeQueries (keyOrPattern) { return queryClient.removeQueries(keyOrPattern) },
1690
- getQueryData (keyOrConfig) { return queryClient.getQueryData(keyFor(keyOrConfig, this)) },
1691
- setQueryData (keyOrConfig, updater) { return queryClient.setQueryData(keyFor(keyOrConfig, this), updater) }
1730
+ invalidateQueries (keyOrPattern) { enterContext(this?.context); return queryClient.invalidateQueries(keyOrPattern) },
1731
+ removeQueries (keyOrPattern) { enterContext(this?.context); return queryClient.removeQueries(keyOrPattern) },
1732
+ getQueryData (keyOrConfig) { enterContext(this?.context); return queryClient.getQueryData(keyFor(keyOrConfig, this)) },
1733
+ setQueryData (keyOrConfig, updater) { enterContext(this?.context); return queryClient.setQueryData(keyFor(keyOrConfig, this), updater) }
1692
1734
  }
1693
1735
 
1694
1736
  // --- Plugin interface ---
@@ -1720,5 +1762,6 @@ export const fetchPlugin = {
1720
1762
  }
1721
1763
 
1722
1764
  export { parseDuration }
1723
- export { earlyKey, EARLY_KEY, createEarlySeedScript } from './early.js'
1765
+ export { earlyKey, EARLY_KEY, createEarlySeedScript, createEarlySeedBlock, SEED_BLOCK } from './early.js'
1766
+ export { requestsInFlight, whenRequestsIdle } from './inflight.js'
1724
1767
  export default executeFetch
package/inflight.js ADDED
@@ -0,0 +1,39 @@
1
+ 'use strict'
2
+
3
+ // --- Requests in flight ---
4
+ //
5
+ // Every request a REST adapter sends counts from its call until its body is
6
+ // read. smbls holds the hydration window over a pre-rendered page open until
7
+ // the first view's requests are done (smbls prerender.js), so a list that
8
+ // renders with its first data still adopts the server's rows.
9
+ //
10
+ // The count lives on globalThis under a Symbol.for slot, like the adapter
11
+ // registry (index.js CUSTOM_ADAPTERS): the copy of this package that smbls
12
+ // asks and the copy an app bundle sends through may be two module instances.
13
+
14
+ const KEY = Symbol.for('@symbo.ls/fetch:IN_FLIGHT')
15
+
16
+ const state = () => globalThis[KEY] || (globalThis[KEY] = { count: 0, waiters: [] })
17
+
18
+ export const requestStarted = () => {
19
+ state().count++
20
+ }
21
+
22
+ export const requestFinished = () => {
23
+ const s = state()
24
+ s.count = s.count > 0 ? s.count - 1 : 0
25
+ if (s.count === 0 && s.waiters.length) {
26
+ const waiters = s.waiters
27
+ s.waiters = []
28
+ for (const resolve of waiters) resolve()
29
+ }
30
+ }
31
+
32
+ /** How many REST adapter requests are in flight on this page. */
33
+ export const requestsInFlight = () => state().count
34
+
35
+ /** Resolves once no REST adapter request is in flight (at once when none is). */
36
+ export const whenRequestsIdle = () => {
37
+ const s = state()
38
+ return s.count === 0 ? Promise.resolve() : new Promise((resolve) => { s.waiters.push(resolve) })
39
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symbo.ls/fetch",
3
- "version": "3.14.664",
3
+ "version": "3.14.665",
4
4
  "license": "CC-BY-NC-4.0",
5
5
  "type": "module",
6
6
  "module": "./dist/esm/index.js",
@@ -41,8 +41,8 @@
41
41
  "adapters"
42
42
  ],
43
43
  "dependencies": {
44
- "@symbo.ls/signal": "^3.14.787",
45
- "@symbo.ls/utils": "^3.14.786"
44
+ "@symbo.ls/signal": "^3.14.789",
45
+ "@symbo.ls/utils": "^3.14.787"
46
46
  },
47
47
  "sideEffects": false,
48
48
  "publishConfig": {