@firsthandjs/data 0.9.1 → 0.10.1

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/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{createContext as N,effect as _,isRendering as Q,onCleanup as D,untrack as G,useContext as K}from"@firsthandjs/core";import{batch as A,signal as v}from"@firsthandjs/core";var z=Object.freeze({});function k(e,n=z){return{name:e,vars:n}}function q(e,n){if(e.name!==n.name)return!1;for(let r of Object.keys(e.vars))if(!Object.is(e.vars[r],n.vars[r]))return!1;return!0}function h(e,n){for(let r of e)for(let t of n)if(q(r,t))return!0;return!1}function L(e={}){let n=new Set,r=e.remember??6e4,t=[],o=()=>Date.now();return{storage:e.storage,missed:(s,l)=>{if(r===0||t.length===0)return!1;let i=o()-r;return t=t.filter(a=>a.at>=i),t.some(a=>a.at>s.answeredAt&&h(a.patterns,l))},settled:s=>{t.length!==0&&(t=t.filter(l=>!h(l.patterns,s)))},settle:async(s=10)=>{for(let l=0;l<s;l++){let i=[];for(let a of n)a.inflight!==null&&i.push(a.inflight);if(i.length===0)return;await Promise.all(i)}},hold:s=>(n.add(s),()=>n.delete(s)),invalidate:async(...s)=>{let l=[];for(let i of e.caches??[])i.forgetTagged(s);r>0&&t.push({patterns:s,at:o()});for(let i of[...n])i.controller!==null&&i.pending.push(...s),h(s,i.tags)&&(i.name,i.tags,l.push(i.run(!0)));await Promise.all(l)},clear:()=>{t=[];for(let s of[...n])s.controller?.abort(),n.delete(s);try{e.storage?.clear?.()}catch{}},get size(){return n.size}}}function x(e,n){return{data:v(void 0),error:v(void 0),status:v("idle"),loading:v(!1),tags:[],controller:null,pending:[],inflight:null,superseded:!1,disposed:!1,answeredAt:0,name:n}}function T(e,n){e.answeredAt=Date.now(),A(()=>{e.data.value=n,e.error.value=void 0,e.status.value="success",e.loading.value=!1})}function w(e,n){A(()=>{e.error.value=n,e.status.value="error",e.loading.value=!1})}function C(e,n){return{data:e.data,error:e.error,status:e.status,loading:e.loading,reload:()=>e.run(!0),dispose:()=>{e.disposed=!0,e.controller?.abort(),n()}}}var $=N();function b(){return K($).value}function U(){let e=b();return(...n)=>e.invalidate(...n)}function V(e,n){n===void 0||e.data.peek()!==void 0||e.disposed||(T(e,n),e.loading.value=!0)}function B(e){return typeof e=="object"&&e!==null&&typeof e.then=="function"}function j(e,n={}){let r=b(),t=x(r,n.persist),o=r.hold(t);n.persist,t.run=i=>{if(t.disposed)return Promise.resolve(void 0);t.controller?.abort();let a=new AbortController;t.controller=a,t.pending=[],t.superseded=!1,t.loading.value=!0,t.data.peek()===void 0&&(t.status.value="loading");let d=i,u=!1,c=(...f)=>{t.tags=f,!d&&r.missed(t,f)&&(d=!0,u&&(t.superseded=!0)),t.pending.length>0&&h(t.pending,f)&&(t.superseded=!0)},y={signal:a.signal,get force(){return u=!0,d},get declared(){return t.tags},tags:c},g={signal:a.signal,get force(){return u=!0,d},request:y,tags:c},p=e(g).then(async f=>{if(!(a.signal.aborted||t.disposed)){if(t.controller=null,T(t,f),t.superseded||r.settled(t.tags),n.persist!==void 0)try{r.storage?.write?.(n.persist,f)}catch{}return t.superseded?(t.superseded=!1,t.run(!0)):f}}).catch(f=>{a.signal.aborted||t.disposed||(t.controller=null,w(t,f))});return t.inflight=p,p.then(()=>{t.inflight===p&&(t.inflight=null)}),p};let s=n.persist,l=r.storage;if(s!==void 0&&l?.read!==void 0){let i;try{i=l.read(s)}catch{i=void 0}B(i)?(async()=>{try{V(t,await i)}catch{}})():V(t,i)}return Q()?t.data.peek()===void 0?t.run(!1):t.loading.value=!1:_(()=>{t.run(!1)}),D(()=>{t.disposed=!0,t.controller?.abort(),n.persist,t.tags,o()}),C(t,o)}function Z(e){let n=b(),r=x(n,void 0),t=null;return D(()=>{r.disposed=!0,t?.abort()}),{data:r.data,error:r.error,status:r.status,running:r.loading,run:async o=>{t?.abort(),t=new AbortController;let s=t,l=[];r.loading.value=!0,r.status.value="loading";try{let i=(...d)=>{l=d},a=await G(()=>e(o,{signal:s.signal,invalidates:i,request:{signal:s.signal,force:!0,mutating:!0,tags:i}}));return s.signal.aborted||r.disposed?void 0:(T(r,a),l.length>0&&await n.invalidate(...l),a)}catch(i){if(s.signal.aborted||r.disposed)return;w(r,i);return}}}}function W(e,n={}){let r=b(),t=x(r,void 0),o=r.hold(t);t.run=()=>n.reload===void 0?Promise.resolve(void 0):Y(n.reload()),t.loading.value=!0,t.status.value="loading";let s=e.subscribe({next:i=>{T(t,i)},error:i=>{w(t,i)}}),l=typeof s=="function"?s:()=>{s.unsubscribe()};return D(()=>{t.disposed=!0,l(),o()}),C(t,()=>{l(),o()})}function X(e){return j(()=>e())}async function Y(e){await e}function O(e){return e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(O).join(",")}]`:e instanceof Date?e.toISOString():`{${Object.entries(e).filter(([,r])=>r!==void 0).sort(([r],[t])=>r<t?-1:1).map(([r,t])=>`${r}:${O(t)}`).join(",")}}`}function S(e={}){let n=e.ttl??0,r=e.max??100,t=e.now??(()=>Date.now()),o=new Map,s=a=>{o.get(a)?.controller?.abort(),o.delete(a)},l=(a,d)=>{i(a,{value:d,tags:[],expires:n===0?1/0:t()+n,inflight:null,controller:null,waiting:0})},i=(a,d)=>{if(o.delete(a),o.set(a,d),o.size>r)for(let u of o.keys()){s(u);break}};return{get size(){return o.size},dump:()=>{let a={};for(let[d,u]of o)u.inflight===null&&(a[d]=u.value);return a},seed:a=>{for(let d in a)l(d,a[d])},settle:async(a=10)=>{for(let d=0;d<a;d++){let u=[];for(let c of o.values())c.inflight!==null&&u.push(c.inflight);if(u.length===0)return;await Promise.all(u.map(async c=>c.catch(()=>{})))}},peek:a=>{let d=o.get(a);if(!(d===void 0||d.expires<=t()))return d.value},write:l,forget:a=>{if(a===void 0){for(let d of[...o.keys()])s(d);return}s(a)},forgetTagged:a=>{for(let[d,u]of[...o])u.tags.length>0&&h(a,u.tags)&&s(d)},read:(a,d)=>async u=>{if(u.mutating===!0)return await d(u);let c=o.get(a);if(u.force)s(a);else if(c!==void 0){if(c.inflight!==null)return await E(c,u);if(c.expires>t())return i(a,c),c.value;o.delete(a)}let y=new AbortController,g={value:void 0,tags:u.declared??[],expires:0,inflight:null,controller:y,waiting:0},p=d({signal:y.signal,force:u.force}).then(f=>(o.get(a)===g&&(n===0?o.delete(a):(g.value=f,g.expires=t()+n,g.inflight=null,g.controller=null)),f)).catch(f=>{throw o.get(a)===g&&o.delete(a),f});return g.inflight=p,i(a,g),await E(g,u)}}}async function E(e,n){e.waiting+=1;let r=()=>{e.waiting<=1&&e.inflight!==null&&e.controller?.abort()};n.signal.addEventListener("abort",r,{once:!0});try{return await e.inflight}finally{n.signal.removeEventListener("abort",r),e.waiting-=1}}function ee(e){let n=new Map(e===void 0?[]:Object.entries(e));return{get size(){return n.size},read:r=>n.get(r),write:(r,t)=>{n.set(r,t)},clear:()=>{n.clear()},dump:()=>Object.fromEntries(n),seed:r=>{for(let t in r)n.set(t,r[t])}}}function te(e){return JSON.stringify(e).replace(ne,n=>re[n])}var ne=/[<\u2028\u2029]/g,re={"<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"};var oe=/^@(tag|invalidates)\b/,ae=/\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/,F=/^[_A-Za-z][_0-9A-Za-z]*/,m=class extends Error{constructor(n){super(n),this.name="FirsthandDirectiveError"}};function P(e,n){if(e.startsWith('"""',n)){let t=e.indexOf('"""',n+3);return t===-1?e.length:t+3}let r=n+1;for(;r<e.length&&e[r]!=='"';)r+=e[r]==="\\"?2:1;return r+1}function se(e,n){let r=0,t=n;for(;t<e.length;){let o=e[t];if(o==='"'){t=P(e,t);continue}if(o==="("||o==="["||o==="{")r++;else if((o===")"||o==="]"||o==="}")&&(r--,r===0))return t+1;t++}throw new m(`unclosed arguments in ${e.slice(n,n+40)}`)}function ie(e,n){try{return JSON.parse(e)}catch{throw new m(`@${n}: ${e} is not a valid string`)}}function le(e,n){let r={},t=0,o=()=>{for(;t<e.length&&/[\s,]/.test(e[t]);)t++};for(o();t<e.length;){let s=F.exec(e.slice(t));if(s===null)throw new m(`@${n}: expected an argument name at "${e.slice(t)}"`);if(t+=s[0].length,o(),e[t]!==":")throw new m(`@${n}: argument ${s[0]} has no value`);t++,o();let l=de(e,n,t);r[s[0]]=l.value,t=l.next,o()}return r}function de(e,n,r){let t=e[r];if(t==="$"){let a=F.exec(e.slice(r+1));if(a===null)throw new m(`@${n}: expected a variable name after $`);return{value:{variable:a[0]},next:r+1+a[0].length}}if(t==='"'){let a=P(e,r),d=e.slice(r,a);return{value:{literal:d.startsWith('"""')?d.slice(3,-3).trim():ie(d,n)},next:a}}if(t==="["||t==="{")throw new m(`@${n}: a tag variable must be a scalar, not a list or object`);let o=/^[^\s,)]+/.exec(e.slice(r));if(o===null)throw new m(`@${n}: expected a value`);let s=o[0],l=r+s.length;if(s==="true"||s==="false")return{value:{literal:s==="true"},next:l};if(s==="null")return{value:{literal:null},next:l};let i=Number(s);return{value:{literal:Number.isNaN(i)?s:i},next:l}}function ue(e){let n=[],r=[],t="",o=0,s=0;for(;o<e.length;){let l=e[o];if(l==='"'){o=P(e,o);continue}if(l==="#"){let p=e.indexOf(`
2
- `,o);o=p===-1?e.length:p;continue}if(l!=="@"){o++;continue}let i=oe.exec(e.slice(o));if(i===null){o++;continue}let a=o+i[0].length,d="",u=a;for(;u<e.length&&/\s/.test(e[u]);)u++;if(e[u]==="("){let p=se(e,u);d=e.slice(u+1,p-1),a=p}let c=le(d,i[1]),y=c.name;if(y===void 0||!("literal"in y)||typeof y.literal!="string")throw new m(`@${i[1]} needs a literal name, as in @${i[1]}(name: "user", id: $id)`);delete c.name,(i[1]==="tag"?n:r).push({name:y.literal,vars:c});let g=o;for(;g>s&&/\s/.test(e[g-1]);)g--;t+=e.slice(s,g),s=a,o=a}return{tags:n,invalidates:r,stripped:t+e.slice(s)}}function ce(e){let{tags:n,invalidates:r,stripped:t}=ue(e),o=ae.exec(t.replace(/#[^\n]*/g,""));return{source:t,operation:o?.[2]??"",kind:o?.[1]??"query",tags:n,invalidates:r}}function ge(e,n){return e.map(r=>{let t={};for(let[o,s]of Object.entries(r.vars)){if("literal"in s){t[o]=s.literal;continue}let l=n[s.variable];l!=null&&(t[o]=typeof l=="object"?JSON.stringify(l):l)}return k(r.name,t)})}import{untrack as I}from"@firsthandjs/core";var R=class extends Error{constructor(r,t,o){super(`HTTP ${String(r)} for ${t}`);this.status=r;this.url=t;this.body=o;this.name="FirsthandHttpError"}status;url;body};function fe(e,n,r){let t=/^[a-z]+:\/\//i.test(n)?n:`${e.baseUrl??""}${n}`,{json:o,cacheKey:s,...l}=r,i={...e.init,...l},a=new Headers(typeof e.headers=="function"?I(e.headers):e.headers);for(let[d,u]of new Headers(r.headers??{}))a.set(d,u);return o!==void 0&&(i.body=JSON.stringify(o),a.has("content-type")||a.set("content-type","application/json")),i.headers=a,[t,i]}async function H(e,n,r,t){let s=await(e.fetch??globalThis.fetch)(n,{...r,signal:t.signal}),l=await s.text(),i=l===""?void 0:JSON.parse(l);if(!s.ok)throw new R(s.status,n,i);return i}function J(e={}){let n=e.cache===void 0||e.cache===!1?void 0:"read"in e.cache?e.cache:S(e.cache),r={cache:n,request:(t,o={})=>async s=>{let[l,i]=fe(e,t,o),a=(i.method??"GET").toUpperCase(),d=e.scope===void 0?i.headers.get("authorization")??"":I(e.scope),u=typeof o.cacheKey=="string"?o.cacheKey:a==="GET"||a==="HEAD"?`${a} ${l}`:void 0,c=u===void 0?void 0:`${d}\0${u}`;return n===void 0||o.cacheKey===!1||c===void 0||s.mutating===!0?await H(e,l,i,s):await n.read(c,y=>H(e,l,i,y))(s)},get:(t,o={})=>r.request(t,o),post:(t,o={})=>r.request(t,{method:"POST",...o}),put:(t,o={})=>r.request(t,{method:"PUT",...o}),patch:(t,o={})=>r.request(t,{method:"PATCH",...o}),remove:(t,o={})=>r.request(t,{method:"DELETE",...o}),with:t=>J({...e,...t,cache:t.cache??n??!1})};return r}export{$ as DataContext,m as FirsthandDirectiveError,R as FirsthandHttpError,h as anyTagMatches,S as createCacheClient,L as createData,J as createFetchClient,ee as createMemoryStorage,W as fromObservable,X as fromPromise,ce as parseGraphQL,ge as resolveTags,te as serialize,O as stableKey,k as tag,q as tagMatches,Z as useAction,b as useData,U as useInvalidate,j as useResource};
1
+ import{createContext as Q,effect as G,isRendering as K,onCleanup as L,useContext as U}from"@firsthandjs/core";import{batch as D,signal as h}from"@firsthandjs/core";var $=Object.freeze({});function v(e,t=$){return{name:e,vars:t}}function C(e,t){if(e.name!==t.name)return!1;for(let r of Object.keys(e.vars))if(!Object.is(e.vars[r],t.vars[r]))return!1;return!0}function c(e,t){for(let r of e)for(let n of t)if(C(r,n))return!0;return!1}function O(e={}){let t={options:e,held:new Set,recent:[],remember:e.remember??6e4};return{storage:e.storage,missed:(r,n)=>I(t,r,n),settled:r=>{z(t,r)},settle:(r=10)=>M(t,r),hold:r=>(t.held.add(r),()=>t.held.delete(r)),invalidate:(...r)=>N(t,r),clear:()=>{_(t)},get size(){return t.held.size}}}function I(e,t,r){if(e.remember===0||e.recent.length===0)return!1;let n=Date.now()-e.remember;return e.recent=e.recent.filter(o=>o.at>=n),e.recent.some(o=>o.at>t.answeredAt&&c(o.patterns,r))}function z(e,t){e.recent.length!==0&&(e.recent=e.recent.filter(r=>!c(r.patterns,t)))}async function M(e,t){for(let r=0;r<t;r++){let n=[];for(let o of e.held)o.inflight!==null&&n.push(o.inflight);if(n.length===0)return;await Promise.all(n)}}async function N(e,t){let r=[];for(let n of e.options.caches??[])n.forgetTagged(t);e.remember>0&&e.recent.push({patterns:t,at:Date.now()});for(let n of[...e.held])n.controller!==null&&n.pending.push(...t),c(t,n.tags)&&(n.name,n.tags,r.push(n.run(!0)));await Promise.all(r)}function _(e){e.recent=[];for(let t of[...e.held])t.controller?.abort(),e.held.delete(t);try{e.options.storage?.clear?.()}catch{}}function m(e,t){return{data:h(void 0),error:h(void 0),status:h("idle"),loading:h(!1),tags:[],controller:null,pending:[],inflight:null,superseded:!1,disposed:!1,answeredAt:0,name:t}}function g(e,t){e.answeredAt=Date.now(),D(()=>{e.data.value=t,e.error.value=void 0,e.status.value="success",e.loading.value=!1})}function y(e,t){D(()=>{e.error.value=t,e.status.value="error",e.loading.value=!1})}function x(e,t){return{data:e.data,error:e.error,status:e.status,loading:e.loading,reload:()=>e.run(!0),dispose:()=>{e.disposed=!0,e.controller?.abort(),t()}}}var q=Q();function f(){return U(q).value}function B(){let e=f();return(...t)=>e.invalidate(...t)}function P(e,t){t===void 0||e.data.peek()!==void 0||e.disposed||(g(e,t),e.loading.value=!0)}function Z(e){return typeof e=="object"&&e!==null&&typeof e.then=="function"}function A(e,t={}){let r=f(),n=m(r,t.persist),o=r.hold(n);t.persist;let a={entry:n,store:r,persist:t.persist};return n.run=i=>W(a,e,i),Y(n,r,t.persist),ee(n),L(()=>{n.disposed=!0,n.controller?.abort(),t.persist,n.tags,o()}),x(n,o)}function W(e,t,r){let{entry:n,store:o}=e;if(n.disposed)return Promise.resolve(void 0);n.controller?.abort();let a=new AbortController;n.controller=a,n.pending=[],n.superseded=!1,n.loading.value=!0,n.data.peek()===void 0&&(n.status.value="loading");let i=t(ne(n,o,a,r)).then(async s=>X(e,a,s)).catch(s=>{a.signal.aborted||n.disposed||(n.controller=null,y(n,s))});return n.inflight=i,i.then(()=>{n.inflight===i&&(n.inflight=null)}),i}async function X(e,t,r){let{entry:n,store:o,persist:a}=e;if(!(t.signal.aborted||n.disposed)){if(n.controller=null,g(n,r),n.superseded||o.settled(n.tags),a!==void 0)try{o.storage?.write?.(a,r)}catch{}return n.superseded?(n.superseded=!1,n.run(!0)):r}}function Y(e,t,r){let n=t.storage;if(r===void 0||n?.read===void 0)return;let o;try{o=n.read(r)}catch{o=void 0}if(!Z(o)){P(e,o);return}(async()=>{try{P(e,await o)}catch{}})()}function ee(e){if(!K()){G(()=>{e.run(!1)});return}e.data.peek()===void 0?e.run(!1):e.loading.value=!1}function ne(e,t,r,n){let o=n,a=!1,i=(...d)=>{e.tags=d,!o&&t.missed(e,d)&&(o=!0,a&&(e.superseded=!0)),e.pending.length>0&&c(e.pending,d)&&(e.superseded=!0)},s=()=>(a=!0,o),l={signal:r.signal,get force(){return s()},get declared(){return e.tags},tags:i};return{signal:r.signal,get force(){return s()},request:l,tags:i}}function te(e,t={}){let r=f(),n=m(r,void 0),o=r.hold(n);n.run=()=>t.reload===void 0?Promise.resolve(void 0):oe(t.reload()),n.loading.value=!0,n.status.value="loading";let a=e.subscribe({next:s=>{g(n,s)},error:s=>{y(n,s)}}),i=typeof a=="function"?a:()=>{a.unsubscribe()};return L(()=>{n.disposed=!0,i(),o()}),x(n,()=>{i(),o()})}function re(e){return A(()=>e())}async function oe(e){await e}import{onCleanup as ae,untrack as ie}from"@firsthandjs/core";function se(e){let t=f(),r=m(t,void 0),n={controller:null,invalidating:[]};return ae(()=>{r.disposed=!0,n.controller?.abort()}),{data:r.data,error:r.error,status:r.status,running:r.loading,run:o=>de(r,t,n,()=>e(o,le(n)))}}function le(e){let t=e.controller,r=(...n)=>{e.invalidating=n};return{signal:t.signal,invalidates:r,request:{signal:t.signal,force:!0,mutating:!0,tags:r}}}async function de(e,t,r,n){r.controller?.abort(),r.controller=new AbortController;let o=r.controller;r.invalidating=[],e.loading.value=!0,e.status.value="loading";try{let a=await ie(n);return o.signal.aborted||e.disposed?void 0:(g(e,a),r.invalidating.length>0&&await t.invalidate(...r.invalidating),a)}catch(a){if(o.signal.aborted||e.disposed)return;y(e,a);return}}function w(e){return e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(w).join(",")}]`:e instanceof Date?e.toISOString():`{${Object.entries(e).filter(([,r])=>r!==void 0).sort(([r],[n])=>r<n?-1:1).map(([r,n])=>`${r}:${w(n)}`).join(",")}}`}function R(e={}){let t={ttl:e.ttl??0,max:e.max??100,now:e.now??(()=>Date.now()),entries:new Map},r=(n,o)=>{ue(t,n,o)};return{get size(){return t.entries.size},dump:()=>ce(t),seed:n=>{for(let o in n)r(o,n[o])},settle:(n=10)=>ge(t,n),peek:n=>{let o=t.entries.get(n);return o===void 0||o.expires<=t.now()?void 0:o.value},write:r,forget:n=>{for(let o of n===void 0?[...t.entries.keys()]:[n])b(t,o)},forgetTagged:n=>{for(let[o,a]of[...t.entries])a.tags.length>0&&c(n,a.tags)&&b(t,o)},read:(n,o)=>async a=>fe(t,n,o,a)}}function b(e,t){e.entries.get(t)?.controller?.abort(),e.entries.delete(t)}function S(e,t,r){if(e.entries.delete(t),e.entries.set(t,r),e.entries.size>e.max)for(let n of e.entries.keys()){b(e,n);break}}function ue(e,t,r){S(e,t,{value:r,tags:[],expires:e.ttl===0?1/0:e.now()+e.ttl,inflight:null,controller:null,waiting:0})}function ce(e){let t={};for(let[r,n]of e.entries)n.inflight===null&&(t[r]=n.value);return t}async function ge(e,t){for(let r=0;r<t;r++){let n=[];for(let o of e.entries.values())o.inflight!==null&&n.push(o.inflight);if(n.length===0)return;await Promise.all(n.map(async o=>o.catch(()=>{})))}}async function fe(e,t,r,n){if(n.mutating===!0)return await r(n);let o=e.entries.get(t);if(n.force)b(e,t);else if(o!==void 0){if(o.inflight!==null)return await E(o,n);if(o.expires>e.now())return S(e,t,o),o.value;e.entries.delete(t)}return await pe(e,t,r,n)}async function pe(e,t,r,n){let o=new AbortController,a={value:void 0,tags:n.declared??[],expires:0,inflight:null,controller:o,waiting:0},i=r({signal:o.signal,force:n.force}).then(s=>(e.entries.get(t)===a&&me(e,t,a,s),s)).catch(s=>{throw e.entries.get(t)===a&&e.entries.delete(t),s});return a.inflight=i,S(e,t,a),await E(a,n)}function me(e,t,r,n){if(e.ttl===0){e.entries.delete(t);return}r.value=n,r.expires=e.now()+e.ttl,r.inflight=null,r.controller=null}async function E(e,t){e.waiting+=1;let r=()=>{e.waiting<=1&&e.inflight!==null&&e.controller?.abort()};t.signal.addEventListener("abort",r,{once:!0});try{return await e.inflight}finally{t.signal.removeEventListener("abort",r),e.waiting-=1}}function ye(e){let t=new Map(e===void 0?[]:Object.entries(e));return{get size(){return t.size},read:r=>t.get(r),write:(r,n)=>{t.set(r,n)},clear:()=>{t.clear()},dump:()=>Object.fromEntries(t),seed:r=>{for(let n in r)t.set(n,r[n])}}}function Te(e){return JSON.stringify(e).replace(he,t=>be[t])}var he=/[<\u2028\u2029]/g,be={"<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"};var u=class extends Error{constructor(t){super(t),this.name="FirsthandDirectiveError"}},T=class extends Error{constructor(r,n,o){super(`HTTP ${String(r)} for ${n}`);this.status=r;this.url=n;this.body=o;this.name="FirsthandHttpError"}status;url;body};var ve=/^@(tag|invalidates)\b/,xe=/\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/,H=/^[_A-Za-z][_0-9A-Za-z]*/;function k(e,t){if(e.startsWith('"""',t)){let n=e.indexOf('"""',t+3);return n===-1?e.length:n+3}let r=t+1;for(;r<e.length&&e[r]!=='"';)r+=e[r]==="\\"?2:1;return r+1}function we(e,t){let r=0,n=t;for(;n<e.length;){let o=e[n];if(o==='"'){n=k(e,n);continue}if(o==="("||o==="["||o==="{")r++;else if((o===")"||o==="]"||o==="}")&&(r--,r===0))return n+1;n++}throw new u(`unclosed arguments in ${e.slice(t,t+40)}`)}function Re(e,t){try{return JSON.parse(e)}catch{throw new u(`@${t}: ${e} is not a valid string`)}}function Se(e,t){let r={},n=0,o=()=>{for(;n<e.length&&/[\s,]/.test(e[n]);)n++};for(o();n<e.length;){let a=H.exec(e.slice(n));if(a===null)throw new u(`@${t}: expected an argument name at "${e.slice(n)}"`);if(n+=a[0].length,o(),e[n]!==":")throw new u(`@${t}: argument ${a[0]} has no value`);n++,o();let i=ke(e,t,n);r[a[0]]=i.value,n=i.next,o()}return r}function ke(e,t,r){let n=e[r];if(n==="$"){let l=H.exec(e.slice(r+1));if(l===null)throw new u(`@${t}: expected a variable name after $`);return{value:{variable:l[0]},next:r+1+l[0].length}}if(n==='"'){let l=k(e,r),d=e.slice(r,l);return{value:{literal:d.startsWith('"""')?d.slice(3,-3).trim():Re(d,t)},next:l}}if(n==="["||n==="{")throw new u(`@${t}: a tag variable must be a scalar, not a list or object`);let o=/^[^\s,)]+/.exec(e.slice(r));if(o===null)throw new u(`@${t}: expected a value`);let a=o[0],i=r+a.length;if(a==="true"||a==="false")return{value:{literal:a==="true"},next:i};if(a==="null")return{value:{literal:null},next:i};let s=Number(a);return{value:{literal:Number.isNaN(s)?a:s},next:i}}function Ce(e){let t={tags:[],invalidates:[]},r="",n=0,o=0;for(;n<e.length;){let a=De(e,n);if(a!==null){n=a;continue}let i=ve.exec(e.slice(n));if(i===null){n++;continue}let s=Oe(e,n,i,t),l=n;for(;l>o&&/\s/.test(e[l-1]);)l--;r+=e.slice(o,l),o=s,n=s}return{...t,stripped:r+e.slice(o)}}function De(e,t){let r=e[t];if(r==='"')return k(e,t);if(r==="#"){let n=e.indexOf(`
2
+ `,t);return n===-1?e.length:n}return r==="@"?null:t+1}function Oe(e,t,r,n){let o=r[1],a=t+r[0].length,i="",s=a;for(;s<e.length&&/\s/.test(e[s]);)s++;if(e[s]==="("){let p=we(e,s);i=e.slice(s+1,p-1),a=p}let l=Se(i,o),d=l.name;if(d===void 0||!("literal"in d)||typeof d.literal!="string")throw new u(`@${o} needs a literal name, as in @${o}(name: "user", id: $id)`);return delete l.name,(o==="tag"?n.tags:n.invalidates).push({name:d.literal,vars:l}),a}function Pe(e){let{tags:t,invalidates:r,stripped:n}=Ce(e),o=xe.exec(n.replace(/#[^\n]*/g,""));return{source:n,operation:o?.[2]??"",kind:o?.[1]??"query",tags:t,invalidates:r}}function Le(e,t){return e.map(r=>{let n={};for(let[o,a]of Object.entries(r.vars)){if("literal"in a){n[o]=a.literal;continue}let i=t[a.variable];i!=null&&(n[o]=typeof i=="object"?JSON.stringify(i):i)}return v(r.name,n)})}import{untrack as F}from"@firsthandjs/core";function qe(e,t,r){let n=/^[a-z]+:\/\//i.test(t)?t:`${e.baseUrl??""}${t}`,{json:o,cacheKey:a,...i}=r,s={...e.init,...i},l=new Headers(typeof e.headers=="function"?F(e.headers):e.headers);for(let[d,p]of new Headers(r.headers??{}))l.set(d,p);return o!==void 0&&(s.body=JSON.stringify(o),l.has("content-type")||l.set("content-type","application/json")),s.headers=l,[n,s]}async function V(e,t,r,n){let a=await(e.fetch??globalThis.fetch)(t,{...r,signal:n.signal}),i=await a.text(),s=i===""?void 0:JSON.parse(i);if(!a.ok)throw new T(a.status,t,s);return s}function Ae(e,t,r,n){if(t.cacheKey===!1)return;let o=(n.method??"GET").toUpperCase(),a=typeof t.cacheKey=="string"?t.cacheKey:o==="GET"||o==="HEAD"?`${o} ${r}`:void 0;return a===void 0?void 0:`${e.scope===void 0?n.headers.get("authorization")??"":F(e.scope)}\0${a}`}function j(e={}){let t=e.cache===void 0||e.cache===!1?void 0:"read"in e.cache?e.cache:R(e.cache),r={cache:t,request:(n,o={})=>async a=>{let[i,s]=qe(e,n,o),l=Ae(e,o,i,s);return t===void 0||l===void 0||a.mutating===!0?await V(e,i,s,a):await t.read(l,d=>V(e,i,s,d))(a)},get:(n,o={})=>r.request(n,o),post:(n,o={})=>r.request(n,{method:"POST",...o}),put:(n,o={})=>r.request(n,{method:"PUT",...o}),patch:(n,o={})=>r.request(n,{method:"PATCH",...o}),remove:(n,o={})=>r.request(n,{method:"DELETE",...o}),with:n=>j({...e,...n,cache:n.cache??t??!1})};return r}export{q as DataContext,u as FirsthandDirectiveError,T as FirsthandHttpError,c as anyTagMatches,R as createCacheClient,O as createData,j as createFetchClient,ye as createMemoryStorage,te as fromObservable,re as fromPromise,Pe as parseGraphQL,Le as resolveTags,Te as serialize,w as stableKey,v as tag,C as tagMatches,se as useAction,f as useData,B as useInvalidate,A as useResource};
@@ -17,26 +17,6 @@ export type ResourceOptions = {
17
17
  readonly persist?: string;
18
18
  };
19
19
  export declare function useResource<T>(load: (context: LoadContext) => Promise<T>, options?: ResourceOptions): Resource<T>;
20
- export type Action<I, R> = {
21
- readonly data: Resource<R>['data'];
22
- readonly error: Resource<R>['error'];
23
- readonly status: Resource<R>['status'];
24
- readonly running: Resource<R>['loading'];
25
- /** Runs it. Never rejects: failure is reported through `error`. */
26
- run(input: I): Promise<R | undefined>;
27
- };
28
- /**
29
- * Changes something, and says what it changed.
30
- *
31
- * ```tsx
32
- * const rename = useAction(async (input: Rename, { signal, invalidates }) => {
33
- * const changed = await patch(input, signal);
34
- * invalidates(...changed.tags); // the server knows which user that was
35
- * return changed.user;
36
- * });
37
- * ```
38
- */
39
- export declare function useAction<I, R>(run: (input: I, context: ActionContext) => Promise<R>): Action<I, R>;
40
20
  export type ObservableLike<T> = {
41
21
  subscribe(observer: {
42
22
  next?: (value: T) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EAEd,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAGpD,eAAO,MAAM,WAAW,gDAA6B,CAAC;AAEtD,wBAAgB,OAAO,IAAI,SAAS,CAEnC;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAmCF,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAAC,CAAC,CAAC,CA+Lb;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzC,mEAAmE;IACnE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;CACvC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAC5B,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GACpD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CA+Dd;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,SAAS,CAAC,QAAQ,EAAE;QAClB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KAClC,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE,aAAkB,GAC1B,QAAQ,CAAC,CAAC,CAAC,CAoCb;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAErE;AAQD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAKL,KAAK,aAAa,EAElB,KAAK,SAAS,EAEd,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,MAAM,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAGpD,eAAO,MAAM,WAAW,gDAA6B,CAAC;AAEtD,wBAAgB,OAAO,IAAI,SAAS,CAEnC;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAGrE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAmCF,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC1C,OAAO,GAAE,eAAoB,GAC5B,QAAQ,CAAC,CAAC,CAAC,CAoBb;AAgOD,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,SAAS,CAAC,QAAQ,EAAE;QAClB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;KAClC,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE,aAAkB,GAC1B,QAAQ,CAAC,CAAC,CAAC,CAoCb;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAErE;AAQD,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/vite.dev.js CHANGED
@@ -2,16 +2,18 @@
2
2
  import { readFileSync } from "node:fs";
3
3
  import { dirname, resolve } from "node:path";
4
4
 
5
- // packages/data/src/document.ts
6
- var DIRECTIVE = /^@(tag|invalidates)\b/;
7
- var OPERATION = /\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/;
8
- var NAME = /^[_A-Za-z][_0-9A-Za-z]*/;
5
+ // packages/data/src/errors.ts
9
6
  var FirsthandDirectiveError = class extends Error {
10
7
  constructor(message) {
11
8
  super(message);
12
9
  this.name = "FirsthandDirectiveError";
13
10
  }
14
11
  };
12
+
13
+ // packages/data/src/document.ts
14
+ var DIRECTIVE = /^@(tag|invalidates)\b/;
15
+ var OPERATION = /\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/;
16
+ var NAME = /^[_A-Za-z][_0-9A-Za-z]*/;
15
17
  function endOfString(source, start) {
16
18
  if (source.startsWith('"""', start)) {
17
19
  const close = source.indexOf('"""', start + 3);
@@ -117,24 +119,14 @@ function readValue(raw, directive, at) {
117
119
  return { value: { literal: Number.isNaN(asNumber) ? text : asNumber }, next };
118
120
  }
119
121
  function scan(source) {
120
- const tags = [];
121
- const invalidates = [];
122
+ const into = { tags: [], invalidates: [] };
122
123
  let stripped = "";
123
124
  let at = 0;
124
125
  let kept = 0;
125
126
  while (at < source.length) {
126
- const character = source[at];
127
- if (character === '"') {
128
- at = endOfString(source, at);
129
- continue;
130
- }
131
- if (character === "#") {
132
- const newline = source.indexOf("\n", at);
133
- at = newline === -1 ? source.length : newline;
134
- continue;
135
- }
136
- if (character !== "@") {
137
- at++;
127
+ const skipped = skipPast(source, at);
128
+ if (skipped !== null) {
129
+ at = skipped;
138
130
  continue;
139
131
  }
140
132
  const directive = DIRECTIVE.exec(source.slice(at));
@@ -142,26 +134,7 @@ function scan(source) {
142
134
  at++;
143
135
  continue;
144
136
  }
145
- let end = at + directive[0].length;
146
- let args = "";
147
- let probe = end;
148
- while (probe < source.length && /\s/.test(source[probe])) {
149
- probe++;
150
- }
151
- if (source[probe] === "(") {
152
- const close = endOfArguments(source, probe);
153
- args = source.slice(probe + 1, close - 1);
154
- end = close;
155
- }
156
- const vars = parseArguments(args, directive[1]);
157
- const named = vars["name"];
158
- if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
159
- throw new FirsthandDirectiveError(
160
- `@${directive[1]} needs a literal name, as in @${directive[1]}(name: "user", id: $id)`
161
- );
162
- }
163
- delete vars["name"];
164
- (directive[1] === "tag" ? tags : invalidates).push({ name: named.literal, vars });
137
+ const end = takeDirective(source, at, directive, into);
165
138
  let from = at;
166
139
  while (from > kept && /\s/.test(source[from - 1])) {
167
140
  from--;
@@ -170,7 +143,42 @@ function scan(source) {
170
143
  kept = end;
171
144
  at = end;
172
145
  }
173
- return { tags, invalidates, stripped: stripped + source.slice(kept) };
146
+ return { ...into, stripped: stripped + source.slice(kept) };
147
+ }
148
+ function skipPast(source, at) {
149
+ const character = source[at];
150
+ if (character === '"') {
151
+ return endOfString(source, at);
152
+ }
153
+ if (character === "#") {
154
+ const newline = source.indexOf("\n", at);
155
+ return newline === -1 ? source.length : newline;
156
+ }
157
+ return character === "@" ? null : at + 1;
158
+ }
159
+ function takeDirective(source, at, directive, into) {
160
+ const kind = directive[1];
161
+ let end = at + directive[0].length;
162
+ let args = "";
163
+ let probe = end;
164
+ while (probe < source.length && /\s/.test(source[probe])) {
165
+ probe++;
166
+ }
167
+ if (source[probe] === "(") {
168
+ const close = endOfArguments(source, probe);
169
+ args = source.slice(probe + 1, close - 1);
170
+ end = close;
171
+ }
172
+ const vars = parseArguments(args, kind);
173
+ const named = vars["name"];
174
+ if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
175
+ throw new FirsthandDirectiveError(
176
+ `@${kind} needs a literal name, as in @${kind}(name: "user", id: $id)`
177
+ );
178
+ }
179
+ delete vars["name"];
180
+ (kind === "tag" ? into.tags : into.invalidates).push({ name: named.literal, vars });
181
+ return end;
174
182
  }
175
183
  function parseGraphQL(source) {
176
184
  const { tags, invalidates, stripped } = scan(source);
package/dist/vite.js CHANGED
@@ -2,16 +2,18 @@
2
2
  import { readFileSync } from "node:fs";
3
3
  import { dirname, resolve } from "node:path";
4
4
 
5
- // packages/data/src/document.ts
6
- var DIRECTIVE = /^@(tag|invalidates)\b/;
7
- var OPERATION = /\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/;
8
- var NAME = /^[_A-Za-z][_0-9A-Za-z]*/;
5
+ // packages/data/src/errors.ts
9
6
  var FirsthandDirectiveError = class extends Error {
10
7
  constructor(message) {
11
8
  super(message);
12
9
  this.name = "FirsthandDirectiveError";
13
10
  }
14
11
  };
12
+
13
+ // packages/data/src/document.ts
14
+ var DIRECTIVE = /^@(tag|invalidates)\b/;
15
+ var OPERATION = /\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/;
16
+ var NAME = /^[_A-Za-z][_0-9A-Za-z]*/;
15
17
  function endOfString(source, start) {
16
18
  if (source.startsWith('"""', start)) {
17
19
  const close = source.indexOf('"""', start + 3);
@@ -117,24 +119,14 @@ function readValue(raw, directive, at) {
117
119
  return { value: { literal: Number.isNaN(asNumber) ? text : asNumber }, next };
118
120
  }
119
121
  function scan(source) {
120
- const tags = [];
121
- const invalidates = [];
122
+ const into = { tags: [], invalidates: [] };
122
123
  let stripped = "";
123
124
  let at = 0;
124
125
  let kept = 0;
125
126
  while (at < source.length) {
126
- const character = source[at];
127
- if (character === '"') {
128
- at = endOfString(source, at);
129
- continue;
130
- }
131
- if (character === "#") {
132
- const newline = source.indexOf("\n", at);
133
- at = newline === -1 ? source.length : newline;
134
- continue;
135
- }
136
- if (character !== "@") {
137
- at++;
127
+ const skipped = skipPast(source, at);
128
+ if (skipped !== null) {
129
+ at = skipped;
138
130
  continue;
139
131
  }
140
132
  const directive = DIRECTIVE.exec(source.slice(at));
@@ -142,26 +134,7 @@ function scan(source) {
142
134
  at++;
143
135
  continue;
144
136
  }
145
- let end = at + directive[0].length;
146
- let args = "";
147
- let probe = end;
148
- while (probe < source.length && /\s/.test(source[probe])) {
149
- probe++;
150
- }
151
- if (source[probe] === "(") {
152
- const close = endOfArguments(source, probe);
153
- args = source.slice(probe + 1, close - 1);
154
- end = close;
155
- }
156
- const vars = parseArguments(args, directive[1]);
157
- const named = vars["name"];
158
- if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
159
- throw new FirsthandDirectiveError(
160
- `@${directive[1]} needs a literal name, as in @${directive[1]}(name: "user", id: $id)`
161
- );
162
- }
163
- delete vars["name"];
164
- (directive[1] === "tag" ? tags : invalidates).push({ name: named.literal, vars });
137
+ const end = takeDirective(source, at, directive, into);
165
138
  let from = at;
166
139
  while (from > kept && /\s/.test(source[from - 1])) {
167
140
  from--;
@@ -170,7 +143,42 @@ function scan(source) {
170
143
  kept = end;
171
144
  at = end;
172
145
  }
173
- return { tags, invalidates, stripped: stripped + source.slice(kept) };
146
+ return { ...into, stripped: stripped + source.slice(kept) };
147
+ }
148
+ function skipPast(source, at) {
149
+ const character = source[at];
150
+ if (character === '"') {
151
+ return endOfString(source, at);
152
+ }
153
+ if (character === "#") {
154
+ const newline = source.indexOf("\n", at);
155
+ return newline === -1 ? source.length : newline;
156
+ }
157
+ return character === "@" ? null : at + 1;
158
+ }
159
+ function takeDirective(source, at, directive, into) {
160
+ const kind = directive[1];
161
+ let end = at + directive[0].length;
162
+ let args = "";
163
+ let probe = end;
164
+ while (probe < source.length && /\s/.test(source[probe])) {
165
+ probe++;
166
+ }
167
+ if (source[probe] === "(") {
168
+ const close = endOfArguments(source, probe);
169
+ args = source.slice(probe + 1, close - 1);
170
+ end = close;
171
+ }
172
+ const vars = parseArguments(args, kind);
173
+ const named = vars["name"];
174
+ if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
175
+ throw new FirsthandDirectiveError(
176
+ `@${kind} needs a literal name, as in @${kind}(name: "user", id: $id)`
177
+ );
178
+ }
179
+ delete vars["name"];
180
+ (kind === "tag" ? into.tags : into.invalidates).push({ name: named.literal, vars });
181
+ return end;
174
182
  }
175
183
  function parseGraphQL(source) {
176
184
  const { tags, invalidates, stripped } = scan(source);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firsthandjs/data",
3
- "version": "0.9.1",
3
+ "version": "0.10.1",
4
4
  "description": "Resources, actions and invalidation for Firsthand: reactive async state, with the cache one layer down.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,8 +28,8 @@
28
28
  "LICENSE"
29
29
  ],
30
30
  "dependencies": {
31
- "@firsthandjs/core": "0.9.1",
32
- "@firsthandjs/dom": "0.9.1"
31
+ "@firsthandjs/core": "0.10.1",
32
+ "@firsthandjs/dom": "0.10.1"
33
33
  },
34
34
  "engines": {
35
35
  "node": ">=20.11.0"