@firsthandjs/data 0.9.1 → 0.10.0

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 T}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:T(void 0),error:T(void 0),status:T("idle"),loading:T(!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])h(t,o)},forgetTagged:n=>{for(let[o,a]of[...t.entries])a.tags.length>0&&c(n,a.tags)&&h(t,o)},read:(n,o)=>async a=>fe(t,n,o,a)}}function h(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()){h(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)h(e,t);else if(o!==void 0){if(o.inflight!==null)return await H(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 H(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 H(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 ve=/^@(tag|invalidates)\b/,xe=/\b(query|mutation|subscription)\b[^\S\n]*([A-Za-z_]\w*)?/,V=/^[_A-Za-z][_0-9A-Za-z]*/,u=class extends Error{constructor(t){super(t),this.name="FirsthandDirectiveError"}};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=V.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=V.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 j}from"@firsthandjs/core";var b=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};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"?j(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 E(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 b(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")??"":j(e.scope)}\0${a}`}function F(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 E(e,i,s,a):await t.read(l,d=>E(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=>F({...e,...n,cache:n.cache??t??!1})};return r}export{q as DataContext,u as FirsthandDirectiveError,b as FirsthandHttpError,c as anyTagMatches,R as createCacheClient,O as createData,F 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
@@ -117,24 +117,14 @@ function readValue(raw, directive, at) {
117
117
  return { value: { literal: Number.isNaN(asNumber) ? text : asNumber }, next };
118
118
  }
119
119
  function scan(source) {
120
- const tags = [];
121
- const invalidates = [];
120
+ const into = { tags: [], invalidates: [] };
122
121
  let stripped = "";
123
122
  let at = 0;
124
123
  let kept = 0;
125
124
  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++;
125
+ const skipped = skipPast(source, at);
126
+ if (skipped !== null) {
127
+ at = skipped;
138
128
  continue;
139
129
  }
140
130
  const directive = DIRECTIVE.exec(source.slice(at));
@@ -142,26 +132,7 @@ function scan(source) {
142
132
  at++;
143
133
  continue;
144
134
  }
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 });
135
+ const end = takeDirective(source, at, directive, into);
165
136
  let from = at;
166
137
  while (from > kept && /\s/.test(source[from - 1])) {
167
138
  from--;
@@ -170,7 +141,42 @@ function scan(source) {
170
141
  kept = end;
171
142
  at = end;
172
143
  }
173
- return { tags, invalidates, stripped: stripped + source.slice(kept) };
144
+ return { ...into, stripped: stripped + source.slice(kept) };
145
+ }
146
+ function skipPast(source, at) {
147
+ const character = source[at];
148
+ if (character === '"') {
149
+ return endOfString(source, at);
150
+ }
151
+ if (character === "#") {
152
+ const newline = source.indexOf("\n", at);
153
+ return newline === -1 ? source.length : newline;
154
+ }
155
+ return character === "@" ? null : at + 1;
156
+ }
157
+ function takeDirective(source, at, directive, into) {
158
+ const kind = directive[1];
159
+ let end = at + directive[0].length;
160
+ let args = "";
161
+ let probe = end;
162
+ while (probe < source.length && /\s/.test(source[probe])) {
163
+ probe++;
164
+ }
165
+ if (source[probe] === "(") {
166
+ const close = endOfArguments(source, probe);
167
+ args = source.slice(probe + 1, close - 1);
168
+ end = close;
169
+ }
170
+ const vars = parseArguments(args, kind);
171
+ const named = vars["name"];
172
+ if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
173
+ throw new FirsthandDirectiveError(
174
+ `@${kind} needs a literal name, as in @${kind}(name: "user", id: $id)`
175
+ );
176
+ }
177
+ delete vars["name"];
178
+ (kind === "tag" ? into.tags : into.invalidates).push({ name: named.literal, vars });
179
+ return end;
174
180
  }
175
181
  function parseGraphQL(source) {
176
182
  const { tags, invalidates, stripped } = scan(source);
package/dist/vite.js CHANGED
@@ -117,24 +117,14 @@ function readValue(raw, directive, at) {
117
117
  return { value: { literal: Number.isNaN(asNumber) ? text : asNumber }, next };
118
118
  }
119
119
  function scan(source) {
120
- const tags = [];
121
- const invalidates = [];
120
+ const into = { tags: [], invalidates: [] };
122
121
  let stripped = "";
123
122
  let at = 0;
124
123
  let kept = 0;
125
124
  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++;
125
+ const skipped = skipPast(source, at);
126
+ if (skipped !== null) {
127
+ at = skipped;
138
128
  continue;
139
129
  }
140
130
  const directive = DIRECTIVE.exec(source.slice(at));
@@ -142,26 +132,7 @@ function scan(source) {
142
132
  at++;
143
133
  continue;
144
134
  }
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 });
135
+ const end = takeDirective(source, at, directive, into);
165
136
  let from = at;
166
137
  while (from > kept && /\s/.test(source[from - 1])) {
167
138
  from--;
@@ -170,7 +141,42 @@ function scan(source) {
170
141
  kept = end;
171
142
  at = end;
172
143
  }
173
- return { tags, invalidates, stripped: stripped + source.slice(kept) };
144
+ return { ...into, stripped: stripped + source.slice(kept) };
145
+ }
146
+ function skipPast(source, at) {
147
+ const character = source[at];
148
+ if (character === '"') {
149
+ return endOfString(source, at);
150
+ }
151
+ if (character === "#") {
152
+ const newline = source.indexOf("\n", at);
153
+ return newline === -1 ? source.length : newline;
154
+ }
155
+ return character === "@" ? null : at + 1;
156
+ }
157
+ function takeDirective(source, at, directive, into) {
158
+ const kind = directive[1];
159
+ let end = at + directive[0].length;
160
+ let args = "";
161
+ let probe = end;
162
+ while (probe < source.length && /\s/.test(source[probe])) {
163
+ probe++;
164
+ }
165
+ if (source[probe] === "(") {
166
+ const close = endOfArguments(source, probe);
167
+ args = source.slice(probe + 1, close - 1);
168
+ end = close;
169
+ }
170
+ const vars = parseArguments(args, kind);
171
+ const named = vars["name"];
172
+ if (named === void 0 || !("literal" in named) || typeof named.literal !== "string") {
173
+ throw new FirsthandDirectiveError(
174
+ `@${kind} needs a literal name, as in @${kind}(name: "user", id: $id)`
175
+ );
176
+ }
177
+ delete vars["name"];
178
+ (kind === "tag" ? into.tags : into.invalidates).push({ name: named.literal, vars });
179
+ return end;
174
180
  }
175
181
  function parseGraphQL(source) {
176
182
  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.0",
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.0",
32
+ "@firsthandjs/dom": "0.10.0"
33
33
  },
34
34
  "engines": {
35
35
  "node": ">=20.11.0"