muya 2.3.0 → 2.3.2

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/cjs/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var V=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var K=(e,r)=>{for(var o in r)V(e,o,{get:r[o],enumerable:!0})},Y=(e,r,o,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of _(r))!N.call(e,s)&&s!==o&&V(e,s,{get:()=>r[s],enumerable:!(i=j(r,s))||i.enumerable});return e};var W=e=>Y(V({},"__esModule",{value:!0}),e);var $={};K($,{EMPTY_SELECTOR:()=>v,create:()=>H,isAbortError:()=>I,isArray:()=>P,isEqualBase:()=>p,isError:()=>D,isFunction:()=>h,isMap:()=>E,isPromise:()=>f,isSet:()=>x,isSetValueFunction:()=>O,isState:()=>Q,isUndefined:()=>d,select:()=>g,shallow:()=>z,useValue:()=>C});module.exports=W($);var m=class extends Error{static Error="AbortError"};function J(e,r){r&&r.abort();let o=new AbortController,{signal:i}=o;return{promise:new Promise((n,a)=>{i.addEventListener("abort",()=>{a(new m)}),e.then(n).catch(a)}),controller:o}}function y(e,r=p){if(!d(e.current)){if(!d(e.previous)&&r(e.current,e.previous))return!1;e.previous=e.current}return!0}function T(e,r){let{cache:o,emitter:{emit:i}}=e;if(!f(r))return r;o.abortController&&o.abortController.abort();let{promise:s,controller:n}=J(r,o.abortController);return o.abortController=n,s.then(a=>{o.current=a,i()}).catch(a=>{I(a)||(o.current=a,i())})}function f(e){return e instanceof Promise}function h(e){return typeof e=="function"}function E(e){return e instanceof Map}function x(e){return e instanceof Set}function P(e){return Array.isArray(e)}function p(e,r){return e===r?!0:!!Object.is(e,r)}function O(e){return typeof e=="function"}function I(e){return e instanceof m}function D(e){return e instanceof Error}function d(e){return e===void 0}function Q(e){return h(e)&&"get"in e&&"set"in e&&"isSet"in e&&e.isSet===!0}var v=e=>e;function U(){let e=new Map,r=new Set,o=performance.now(),i=!1;function s(){let a=performance.now(),t=a-o,{size:c}=r;if(t<.2&&c>0&&c<10){o=a,n();return}i||(i=!0,Promise.resolve().then(()=>{i=!1,o=performance.now(),n()}))}function n(){if(r.size===0)return;let a=new Set;for(let t of r){if(e.has(t.id)){a.add(t.id);let{onResolveItem:c}=e.get(t.id);c&&c(t.value)}r.delete(t)}if(r.size>0){s();return}for(let t of a)e.get(t)?.onScheduleDone()}return{add(a,t){return e.set(a,t),()=>{e.delete(a)}},schedule(a,t){r.add({value:t,id:a}),s()}}}function g(e,r,o){function i(){let u=!1,l=e.map(A=>{let w=A.get();return f(w)&&(u=!0),w});return u?new Promise((A,w)=>{Promise.all(l).then(G=>{if(G.some(M=>d(M)))return w(new m);let F=r(...G);A(F)})}):r(...l)}function s(){if(d(t.cache.current)){let u=i();t.cache.current=T(t,u)}return t.cache.current}function n(){if(d(t.cache.current)){let l=i();t.cache.current=T(t,l)}let{current:u}=t.cache;return f(u)?new Promise(l=>{u.then(S=>{if(d(S)){l(n());return}l(S)})}):t.cache.current}let a=[];for(let u of e){let l=u.emitter.subscribe(()=>{b.schedule(t.id,null)});a.push(l)}let t=k({destroy(){for(let u of a)u();c(),t.emitter.clear(),t.cache.current=void 0},get:n,getSnapshot:s}),c=b.add(t.id,{onScheduleDone(){let u=i();t.cache.current=T(t,u),y(t.cache,o)&&t.emitter.emit()}});return t}var R=require("react");var L=require("use-sync-external-store/shim/with-selector");function C(e,r=v){let{emitter:o}=e,i=(0,L.useSyncExternalStoreWithSelector)(e.emitter.subscribe,o.getSnapshot,o.getInitialSnapshot,r);if((0,R.useDebugValue)(i),f(i)||D(i))throw i;return i}function q(e,r){let o=new Set,i=[];return{clear:()=>{for(let s of i)s();o.clear()},subscribe:s=>(o.add(s),()=>{o.delete(s)}),emit:(...s)=>{for(let n of o)n(...s)},contains:s=>o.has(s),getSnapshot:e,getInitialSnapshot:r,getSize:()=>o.size,subscribeToOtherEmitter(s){let n=s.subscribe(()=>{this.emit()});i.push(n)}}}var X=0;function Z(){return X++}function k(e){let{get:r,destroy:o,set:i,getSnapshot:s}=e,n=!!i,a={},t=function(c){return C(t,c)};return t.isSet=n,t.id=Z(),t.emitter=q(s),t.destroy=o,t.listen=function(c){return this.emitter.subscribe(()=>{let u=r();f(u)||c(r())})},t.withName=function(c){return this.stateName=c,this},t.select=function(c,u=p){return g([t],c,u)},t.get=r,t.set=i,t.cache=a,t}var b=U();function H(e,r=p){function o(){try{if(d(n.cache.current)){let t=h(e)?e():e,c=T(n,t);return n.cache.current=c,n.cache.current}return n.cache.current}catch(t){n.cache.current=t}return n.cache.current}async function i(t,c){await t;let u=c(n.cache.current),l=T(n,u);n.cache.current=l}function s(t){let c=o(),u=O(t);if(u&&f(c)){i(c,t);return}n.cache.abortController&&n.cache.abortController.abort();let l=u?t(c):t,S=T(n,l);n.cache.current=S}let n=k({get:o,destroy(){o(),a(),n.emitter.clear(),n.cache.current=void 0},set(t){b.schedule(n.id,t)},getSnapshot:o}),a=b.add(n.id,{onScheduleDone(){n.cache.current=o(),y(n.cache,r)&&n.emitter.emit()},onResolveItem:s});return h(e)||o(),n}function z(e,r){if(e==r)return!0;if(typeof e!="object"||e==null||typeof r!="object"||r==null)return!1;if(E(e)&&E(r)){if(e.size!==r.size)return!1;for(let[s,n]of e)if(!Object.is(n,r.get(s)))return!1;return!0}if(x(e)&&x(r)){if(e.size!==r.size)return!1;for(let s of e)if(!r.has(s))return!1;return!0}if(P(e)&&P(r)){if(e.length!==r.length)return!1;for(let[s,n]of e.entries())if(!Object.is(n,r[s]))return!1;return!0}let o=Object.keys(e),i=Object.keys(r);if(o.length!==i.length)return!1;for(let s of o)if(!Object.prototype.hasOwnProperty.call(r,s)||!Object.is(e[s],r[s]))return!1;return!0}
1
+ "use strict";var V=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var Y=Object.prototype.hasOwnProperty;var W=(e,r)=>{for(var o in r)V(e,o,{get:r[o],enumerable:!0})},J=(e,r,o,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of K(r))!Y.call(e,s)&&s!==o&&V(e,s,{get:()=>r[s],enumerable:!(i=N(r,s))||i.enumerable});return e};var Q=e=>J(V({},"__esModule",{value:!0}),e);var $={};W($,{EMPTY_SELECTOR:()=>v,create:()=>F,isAbortError:()=>I,isArray:()=>g,isEqualBase:()=>m,isError:()=>D,isFunction:()=>h,isMap:()=>x,isPromise:()=>f,isSet:()=>E,isSetValueFunction:()=>O,isState:()=>Z,isUndefined:()=>d,select:()=>P,shallow:()=>M,useValue:()=>C});module.exports=Q($);var p=class extends Error{static Error="AbortError"};function X(e,r){r&&r.abort();let o=new AbortController,{signal:i}=o;return{promise:new Promise((n,a)=>{i.addEventListener("abort",()=>{a(new p)}),e.then(n).catch(a)}),controller:o}}function y(e,r=m){if(!d(e.current)){if(!d(e.previous)&&r(e.current,e.previous))return!1;e.previous=e.current}return!0}function T(e,r){let{cache:o,emitter:{emit:i}}=e;if(!f(r))return r;o.abortController&&o.abortController.abort();let{promise:s,controller:n}=X(r,o.abortController);return o.abortController=n,s.then(a=>{o.current=a,i()}).catch(a=>{I(a)||(o.current=a,i())})}function f(e){return e instanceof Promise}function h(e){return typeof e=="function"}function x(e){return e instanceof Map}function E(e){return e instanceof Set}function g(e){return Array.isArray(e)}function m(e,r){return e===r?!0:!!Object.is(e,r)}function O(e){return typeof e=="function"}function I(e){return e instanceof p}function D(e){return e instanceof Error}function d(e){return e===void 0}function Z(e){return h(e)&&"get"in e&&"set"in e&&"isSet"in e&&e.isSet===!0}var v=e=>e;function U(){let e=new Map,r=new Set,o=performance.now(),i=!1;function s(){let a=performance.now(),t=a-o,{size:c}=r;if(t<.2&&c>0&&c<10){o=a,n();return}i||(i=!0,Promise.resolve().then(()=>{i=!1,o=performance.now(),n()}))}function n(){if(r.size===0)return;let a=new Set;for(let t of r){if(e.has(t.id)){a.add(t.id);let{onResolveItem:c}=e.get(t.id);c&&c(t.value)}r.delete(t)}if(r.size>0){s();return}for(let t of a)e.get(t)?.onScheduleDone()}return{add(a,t){return e.set(a,t),()=>{e.delete(a)}},schedule(a,t){r.add({value:t,id:a}),s()}}}function P(e,r,o){function i(){let u=!1,l=e.map(A=>{let w=A.get();return f(w)&&(u=!0),w});return u?new Promise((A,w)=>{Promise.all(l).then(G=>{if(G.some(_=>d(_)))return w(new p);let j=r(...G);A(j)})}):r(...l)}function s(){if(d(t.cache.current)){let u=i();t.cache.current=T(t,u)}return t.cache.current}function n(){if(d(t.cache.current)){let l=i();t.cache.current=T(t,l)}let{current:u}=t.cache;return f(u)?new Promise(l=>{u.then(S=>{if(d(S)){l(n());return}l(S)})}):t.cache.current}let a=[];for(let u of e){let l=u.emitter.subscribe(()=>{b.schedule(t.id,null)});a.push(l)}let t=k({destroy(){for(let u of a)u();c(),t.emitter.clear(),t.cache.current=void 0},get:n,getSnapshot:s}),c=b.add(t.id,{onScheduleDone(){let u=i();t.cache.current=T(t,u),y(t.cache,o)&&t.emitter.emit()}});return t}var R=require("react");var L=require("use-sync-external-store/shim/with-selector");function C(e,r=v){let{emitter:o}=e,i=(0,L.useSyncExternalStoreWithSelector)(e.emitter.subscribe,o.getSnapshot,o.getInitialSnapshot,r);if((0,R.useDebugValue)(i),f(i)||D(i))throw i;return i}function q(e,r){let o=new Set,i=[];return{clear:()=>{for(let s of i)s();o.clear()},subscribe:s=>(o.add(s),()=>{o.delete(s)}),emit:(...s)=>{for(let n of o)n(...s)},contains:s=>o.has(s),getSnapshot:e,getInitialSnapshot:r,getSize:()=>o.size,subscribeToOtherEmitter(s){let n=s.subscribe(()=>{this.emit()});i.push(n)}}}var H=0;function z(){return H++,H.toString(36)}function k(e){let{get:r,destroy:o,set:i,getSnapshot:s}=e,n=!!i,a={},t=function(c){return C(t,c)};return t.isSet=n,t.id=z(),t.emitter=q(s),t.destroy=o,t.listen=function(c){return this.emitter.subscribe(()=>{let u=r();f(u)||c(r())})},t.withName=function(c){return this.stateName=c,this},t.select=function(c,u=m){return P([t],c,u)},t.get=r,t.set=i,t.cache=a,t}var b=U();function F(e,r=m){function o(){try{if(d(n.cache.current)){let t=h(e)?e():e,c=T(n,t);return n.cache.current=c,n.cache.current}return n.cache.current}catch(t){n.cache.current=t}return n.cache.current}async function i(t,c){await t;let u=c(n.cache.current),l=T(n,u);n.cache.current=l}function s(t){let c=o(),u=O(t);if(u&&f(c)){i(c,t);return}n.cache.abortController&&n.cache.abortController.abort();let l=u?t(c):t,S=T(n,l);n.cache.current=S}let n=k({get:o,destroy(){o(),a(),n.emitter.clear(),n.cache.current=void 0},set(t){b.schedule(n.id,t)},getSnapshot:o}),a=b.add(n.id,{onScheduleDone(){n.cache.current=o(),y(n.cache,r)&&n.emitter.emit()},onResolveItem:s});return h(e)||o(),n}function M(e,r){if(e==r)return!0;if(typeof e!="object"||e==null||typeof r!="object"||r==null)return!1;if(x(e)&&x(r)){if(e.size!==r.size)return!1;for(let[s,n]of e)if(!Object.is(n,r.get(s)))return!1;return!0}if(E(e)&&E(r)){if(e.size!==r.size)return!1;for(let s of e)if(!r.has(s))return!1;return!0}if(g(e)&&g(r)){if(e.length!==r.length)return!1;for(let[s,n]of e.entries())if(!Object.is(n,r[s]))return!1;return!0}let o=Object.keys(e),i=Object.keys(r);if(o.length!==i.length)return!1;for(let s of o)if(!Object.prototype.hasOwnProperty.call(r,s)||!Object.is(e[s],r[s]))return!1;return!0}
@@ -1 +1 @@
1
- import{select as l}from"./select";import{useValue as S}from"./use-value";import{createEmitter as d}from"./utils/create-emitter";import{isEqualBase as m,isPromise as T}from"./utils/is";let f=0;function p(){return f++}function G(n){const{get:a,destroy:o,set:s,getSnapshot:i}=n,u=!!s,c={},t=function(e){return S(t,e)};return t.isSet=u,t.id=p(),t.emitter=d(i),t.destroy=o,t.listen=function(e){return this.emitter.subscribe(()=>{const r=a();T(r)||e(a())})},t.withName=function(e){return this.stateName=e,this},t.select=function(e,r=m){return l([t],e,r)},t.get=a,t.set=s,t.cache=c,t}export{G as createState};
1
+ import{select as l}from"./select";import{useValue as m}from"./use-value";import{createEmitter as S}from"./utils/create-emitter";import{getId as T}from"./utils/id";import{isEqualBase as d,isPromise as p}from"./utils/is";function G(n){const{get:r,destroy:o,set:s,getSnapshot:i}=n,u=!!s,c={},t=function(e){return m(t,e)};return t.isSet=u,t.id=T(),t.emitter=S(i),t.destroy=o,t.listen=function(e){return this.emitter.subscribe(()=>{const a=r();p(a)||e(r())})},t.withName=function(e){return this.stateName=e,this},t.select=function(e,a=d){return l([t],e,a)},t.get=r,t.set=s,t.cache=c,t}export{G as createState};
@@ -1 +1 @@
1
- import{createScheduler as P}from"../scheduler";import{shallow as O}from"../utils/shallow";import{selectSql as v}from"./select-sql";import{createTable as R,DEFAULT_STEP_SIZE as M}from"./table/table";const f=P();let C=0;function B(){return C++}function L(g){const k=B();function m(e){return`state-${k}-search-${e}`}let h;async function o(){if(!h){const{backend:e,...n}=g,t=e instanceof Promise?await e:e;h=await R({backend:t,...n})}return h}const c=new Map,i=new Map,S=new Map;async function p(e,n){const t=S.get(e),{options:a={}}=n,{stepSize:s=M}=a;if(!t)return!1;const r=[];for(let u=0;u<s;u++){const l=await t.next();if(l.done){S.delete(e);break}n.keys.has(String(l.value.rowId))||(r.push(l.value.document),n.keys.add(String(l.value.rowId)))}return r.length===0||O(n.items,r)?!1:(n.items=[...n.items,...r],!0)}function b(e){const n=i.get(e);n&&n()}async function x(e){const n=await o(),t=c.get(e);if(!t)return;const{options:a}=t,s=n.search({...a,select:(r,{rowId:u})=>({document:r,rowId:u})});S.set(e,s),t.keys=new Set,t.items=[],await p(e,t)}async function y(e){await x(e),b(e)}function T(e){const{key:n,op:t}=e,a=new Set;for(const[s,{keys:r}]of c)switch(t){case"delete":case"update":{r.has(String(n))&&a.add(s);break}case"insert":{a.add(s);break}}return a}async function d(e){const n=new Set;for(const t of e){const a=T(t);for(const s of a)n.add(s)}for(const t of n){const a=m(t);f.schedule(a,{searchId:t})}}const D=new Set;function w(e,n){c.has(e)||(c.set(e,{items:[],options:n,keys:new Set}),n&&y(e));const t=c.get(e);return n&&(t.options=n),t}const I={async set(e){const t=await(await o()).set(e);return await d([t]),t},async batchSet(e){const t=await(await o()).batchSet(e);return await d(t),t},async delete(e){const t=await(await o()).delete(e);return t&&await d([t]),t},async deleteBy(e){const t=await(await o()).deleteBy(e);return await d(t),t},async get(e,n){return(await o()).get(e,n)},async*search(e={}){const n=await o();for await(const t of n.search(e))yield t},async count(e){return await(await o()).count(e)},updateSearchOptions(e,n){const t=w(e,n);t.options=n;const a=m(e);f.schedule(a,{searchId:e})},subscribe(e,n){const t=m(e),a=f.add(t,{onScheduleDone(){y(e)}});return D.add(a),i.has(e)||i.set(e,n),()=>{i.delete(e),a(),c.delete(e)}},getSnapshot(e){return w(e).items},refresh:y,destroy(){for(const e of D)e();c.clear(),i.clear()},async next(e){const n=c.get(e);if(n){const t=await p(e,n);return t&&b(e),t}return!1},select(e){return v(I,e)}};return I}export{L as createSqliteState};
1
+ import{STATE_SCHEDULER as y}from"../create";import{getId as P}from"../utils/id";import{shallow as v}from"../utils/shallow";import{selectSql as O}from"./select-sql";import{createTable as R,DEFAULT_STEP_SIZE as M}from"./table/table";function K(g){const k=P();function m(e){return`state-${k}-search-${e}`}let h;async function o(){if(!h){const{backend:e,...n}=g,t=e instanceof Promise?await e:e;h=await R({backend:t,...n})}return h}const c=new Map,i=new Map,S=new Map;async function p(e,n){const t=S.get(e),{options:a={}}=n,{stepSize:s=M}=a;if(!t)return!1;const r=[];for(let u=0;u<s;u++){const l=await t.next();if(l.done){S.delete(e);break}n.keys.has(String(l.value.rowId))||(r.push(l.value.document),n.keys.add(String(l.value.rowId)))}return r.length===0||v(n.items,r)?!1:(n.items=[...n.items,...r],!0)}function b(e){const n=i.get(e);n&&n()}async function x(e){const n=await o(),t=c.get(e);if(!t)return;const{options:a}=t,s=n.search({...a,select:(r,{rowId:u})=>({document:r,rowId:u})});S.set(e,s),t.keys=new Set,t.items=[],await p(e,t)}async function f(e){await x(e),b(e)}function T(e){const{key:n,op:t}=e,a=new Set;for(const[s,{keys:r}]of c)switch(t){case"delete":case"update":{r.has(String(n))&&a.add(s);break}case"insert":{a.add(s);break}}return a}async function d(e){const n=new Set;for(const t of e){const a=T(t);for(const s of a)n.add(s)}for(const t of n){const a=m(t);y.schedule(a,{searchId:t})}}const w=new Set;function D(e,n){c.has(e)||(c.set(e,{items:[],options:n,keys:new Set}),n&&f(e));const t=c.get(e);return n&&(t.options=n),t}const I={async set(e){const t=await(await o()).set(e);return await d([t]),t},async batchSet(e){const t=await(await o()).batchSet(e);return await d(t),t},async delete(e){const t=await(await o()).delete(e);return t&&await d([t]),t},async deleteBy(e){const t=await(await o()).deleteBy(e);return await d(t),t},async get(e,n){return(await o()).get(e,n)},async*search(e={}){const n=await o();for await(const t of n.search(e))yield t},async count(e){return await(await o()).count(e)},updateSearchOptions(e,n){const t=D(e,n);t.options=n;const a=m(e);y.schedule(a,{searchId:e})},subscribe(e,n){const t=m(e),a=y.add(t,{onScheduleDone(){f(e)}});return w.add(a),i.has(e)||i.set(e,n),()=>{i.delete(e),a(),c.delete(e)}},getSnapshot(e){return D(e).items},refresh:f,destroy(){for(const e of w)e();c.clear(),i.clear()},async next(e){const n=c.get(e);if(n){const t=await p(e,n);return t&&b(e),t}return!1},select(e){return O(I,e)}};return I}export{K as createSqliteState};
@@ -0,0 +1 @@
1
+ let t=0;function e(){return t++,t.toString(36)}export{e as getId};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muya",
3
- "version": "2.3.0",
3
+ "version": "2.3.2",
4
4
  "author": "samuel.gjabel@gmail.com",
5
5
  "repository": "https://github.com/samuelgjabel/muya",
6
6
  "main": "cjs/index.js",
@@ -2,6 +2,7 @@ import { select } from './select'
2
2
  import type { GetState, SetValue, State, Cache } from './types'
3
3
  import { useValue } from './use-value'
4
4
  import { createEmitter } from './utils/create-emitter'
5
+ import { getId } from './utils/id'
5
6
  import { isEqualBase, isPromise } from './utils/is'
6
7
 
7
8
  interface GetStateOptions<T> {
@@ -11,16 +12,6 @@ interface GetStateOptions<T> {
11
12
  readonly getSnapshot: () => T
12
13
  }
13
14
 
14
- let stateId = 0
15
-
16
- /**
17
- * Generate a unique state ID
18
- * @returns A unique state ID
19
- */
20
- function getStateId() {
21
- return stateId++
22
- }
23
-
24
15
  type FullState<T> = GetStateOptions<T>['set'] extends undefined ? GetState<T> : State<T>
25
16
  /**
26
17
  * This is just utility function to create state base data
@@ -36,7 +27,7 @@ export function createState<T>(options: GetStateOptions<T>): FullState<T> {
36
27
  return useValue(state, selector)
37
28
  }
38
29
  state.isSet = isSet as true
39
- state.id = getStateId()
30
+ state.id = getId()
40
31
  state.emitter = createEmitter<T>(getSnapshot)
41
32
  state.destroy = destroy
42
33
  state.listen = function (listener) {
@@ -79,11 +79,11 @@ describe('use-sqlite-state', () => {
79
79
  const { result } = renderHook(() => {
80
80
  reRenders++
81
81
  const [minAge, setMinAge] = useState(20)
82
- return [useSqliteValue(sql, { where: { age: { gt: minAge } }, sorBy: 'age' }, [minAge]), setMinAge] as const
82
+ return [useSqliteValue(sql, { where: { age: { gt: minAge } }, sortBy: 'age' }, [minAge]), setMinAge] as const
83
83
  })
84
84
 
85
85
  await waitFor(() => {
86
- expect(result.current[0][0].map((p) => p.name)).toEqual(['Alice', 'Bob', 'Carol'])
86
+ expect(result.current[0][0].map((p) => p.name)).toEqual(['Bob', 'Alice', 'Carol'])
87
87
  expect(reRenders).toBe(2)
88
88
  })
89
89
 
@@ -132,17 +132,17 @@ describe('use-sqlite-state', () => {
132
132
  { id: '3', name: 'Carol', age: 40 },
133
133
  ])
134
134
  const { result, rerender } = renderHook(
135
- ({ order, limit }) => useSqliteValue(sql, { sorBy: 'age', order, limit }, [order, limit]),
135
+ ({ order, limit }) => useSqliteValue(sql, { sortBy: 'age', order, limit }, [order, limit]),
136
136
  { initialProps: { order: 'asc' as 'asc' | 'desc', limit: 2 } },
137
137
  )
138
138
  await waitFor(() => {
139
- expect(result.current[0].map((p) => p.name)).toEqual(['Alice', 'Bob'])
139
+ expect(result.current[0].map((p) => p.name)).toEqual(['Bob', 'Alice'])
140
140
  })
141
141
  act(() => {
142
142
  rerender({ order: 'desc', limit: 2 })
143
143
  })
144
144
  await waitFor(() => {
145
- expect(result.current[0].map((p) => p.name)).toEqual(['Alice', 'Bob'])
145
+ expect(result.current[0].map((p) => p.name)).toEqual(['Carol', 'Alice'])
146
146
  })
147
147
  act(() => {
148
148
  rerender({ order: 'desc', limit: 1 })
@@ -243,11 +243,11 @@ describe('use-sqlite-state', () => {
243
243
  people.push({ id: index.toString(), name: `Person${index}`, age: 20 + (index % 50) })
244
244
  }
245
245
  await sql.batchSet(people)
246
- const { result, rerender } = renderHook(({ order }) => useSqliteValue(sql, { sorBy: 'age', order }, [order]), {
246
+ const { result, rerender } = renderHook(({ order }) => useSqliteValue(sql, { sortBy: 'age', order }, [order]), {
247
247
  initialProps: { order: 'asc' as 'asc' | 'desc' },
248
248
  })
249
249
  await waitFor(() => {
250
- expect(result.current[0][0].age).toBe(21)
250
+ expect(result.current[0][0].age).toBe(20)
251
251
  })
252
252
  act(() => {
253
253
  rerender({ order: 'desc' })
@@ -268,14 +268,14 @@ describe('use-sqlite-state', () => {
268
268
  useSqliteValue(
269
269
  sql,
270
270
  {
271
- sorBy: 'age',
271
+ sortBy: 'age',
272
272
  select: (d) => d.name,
273
273
  },
274
274
  [],
275
275
  ),
276
276
  )
277
277
  await waitFor(() => {
278
- expect(result.current[0]).toEqual(['Alice', 'Bob', 'Carol'])
278
+ expect(result.current[0]).toEqual(['Bob', 'Alice', 'Carol'])
279
279
  })
280
280
  })
281
281
  it('should add 50 documents and then load with another hook', async () => {
@@ -286,7 +286,7 @@ describe('use-sqlite-state', () => {
286
286
  return useSqliteValue(
287
287
  sql,
288
288
  {
289
- sorBy: 'age',
289
+ sortBy: 'age',
290
290
  order: 'desc',
291
291
  },
292
292
  [],
@@ -1,7 +1,6 @@
1
1
  /* eslint-disable sonarjs/redundant-type-aliases */
2
- /* eslint-disable @typescript-eslint/no-shadow */
3
- /* eslint-disable no-shadow */
4
- import { createScheduler } from '../scheduler'
2
+ import { STATE_SCHEDULER } from '../create'
3
+ import { getId } from '../utils/id'
5
4
  import { shallow } from '../utils/shallow'
6
5
  import { selectSql, type CreateState } from './select-sql'
7
6
  import type { Backend } from './table'
@@ -10,16 +9,6 @@ import type { DbOptions, DocType, Key, MutationResult, SearchOptions, Table } fr
10
9
  import type { Where } from './table/where'
11
10
 
12
11
  type SearchId = string
13
- const STATE_SCHEDULER = createScheduler()
14
-
15
- let stateId = 0
16
- /**
17
- * Get a unique state ID
18
- * @returns The unique state ID
19
- */
20
- function getStateId() {
21
- return stateId++
22
- }
23
12
 
24
13
  export interface CreateSqliteOptions<Document extends DocType> extends Omit<DbOptions<Document>, 'backend'> {
25
14
  readonly backend: Backend | Promise<Backend>
@@ -60,7 +49,7 @@ interface DataItems<Document extends DocType> {
60
49
  * @returns A SyncTable instance with methods to interact with the underlying Table and manage reactive searches
61
50
  */
62
51
  export function createSqliteState<Document extends DocType>(options: CreateSqliteOptions<Document>): SyncTable<Document> {
63
- const id = getStateId()
52
+ const id = getId()
64
53
 
65
54
  /**
66
55
  * Get a unique schedule ID for a search ID
@@ -102,8 +91,8 @@ export function createSqliteState<Document extends DocType>(options: CreateSqlit
102
91
  */
103
92
  async function next(searchId: SearchId, data: DataItems<Document>): Promise<boolean> {
104
93
  const iterator = iterators.get(searchId)
105
- const { options = {} } = data
106
- const { stepSize = DEFAULT_STEP_SIZE } = options
94
+ const { options: nextOptions = {} } = data
95
+ const { stepSize = DEFAULT_STEP_SIZE } = nextOptions
107
96
  if (!iterator) return false
108
97
  const newItems: Document[] = []
109
98
 
@@ -145,8 +134,8 @@ export function createSqliteState<Document extends DocType>(options: CreateSqlit
145
134
  const table = await getTable()
146
135
  const data = cachedData.get(searchId)
147
136
  if (!data) return
148
- const { options } = data
149
- const iterator = table.search({ ...options, select: (document, { rowId }) => ({ document, rowId }) })
137
+ const { options: refreshOptions } = data
138
+ const iterator = table.search({ ...refreshOptions, select: (document, { rowId }) => ({ document, rowId }) })
150
139
  iterators.set(searchId, iterator)
151
140
  data.keys = new Set()
152
141
  data.items = []
@@ -214,19 +203,19 @@ export function createSqliteState<Document extends DocType>(options: CreateSqlit
214
203
  /**
215
204
  * Register data for a search ID
216
205
  * @param searchId The search ID
217
- * @param options Optional search options
206
+ * @param registerDataOptions Optional search options
218
207
  * @returns The data items for the search ID
219
208
  */
220
- function registerData(searchId: SearchId, options?: SearchOptions<Document, unknown>) {
209
+ function registerData(searchId: SearchId, registerDataOptions?: SearchOptions<Document, unknown>) {
221
210
  if (!cachedData.has(searchId)) {
222
- cachedData.set(searchId, { items: [], options, keys: new Set() })
223
- if (options) {
211
+ cachedData.set(searchId, { items: [], options: registerDataOptions, keys: new Set() })
212
+ if (registerDataOptions) {
224
213
  refresh(searchId)
225
214
  }
226
215
  }
227
216
  const data = cachedData.get(searchId)!
228
- if (options) {
229
- data.options = options
217
+ if (registerDataOptions) {
218
+ data.options = registerDataOptions
230
219
  }
231
220
  return data
232
221
  }
@@ -262,20 +251,20 @@ export function createSqliteState<Document extends DocType>(options: CreateSqlit
262
251
  const table = await getTable()
263
252
  return table.get(key, selector)
264
253
  },
265
- async *search(options = {}) {
254
+ async *search(searchOptions = {}) {
266
255
  const table = await getTable()
267
- for await (const item of table.search(options)) {
256
+ for await (const item of table.search(searchOptions)) {
268
257
  yield item
269
258
  }
270
259
  },
271
- async count(options) {
260
+ async count(countOptions) {
272
261
  const table = await getTable()
273
- return await table.count(options)
262
+ return await table.count(countOptions)
274
263
  },
275
264
 
276
- updateSearchOptions(searchId, options) {
277
- const data = registerData(searchId, options)
278
- data.options = options
265
+ updateSearchOptions(searchId, updateSearchOptions) {
266
+ const data = registerData(searchId, updateSearchOptions)
267
+ data.options = updateSearchOptions
279
268
  const scheduleId = getScheduleId(searchId)
280
269
  STATE_SCHEDULER.schedule(scheduleId, { searchId })
281
270
  },
@@ -1,13 +1,13 @@
1
1
  import { createState } from '../create-state'
2
2
  import type { GetState } from '../types'
3
3
  import type { SyncTable } from './create-sqlite'
4
- import type { DocType } from './table/table.types'
4
+ import type { DocType, DotPath } from './table/table.types'
5
5
  import type { Where } from './table/where'
6
6
 
7
7
  export type CreateState<Document, Params extends unknown[]> = (...params: Params) => GetState<Document[]>
8
8
 
9
9
  export interface SqlSeachOptions<Document extends DocType> {
10
- readonly sorBy?: keyof Document
10
+ readonly sortBy?: DotPath<Document>
11
11
  readonly order?: 'asc' | 'desc'
12
12
  readonly limit?: number
13
13
  readonly offset?: number
@@ -1,4 +1,5 @@
1
1
  // table.types.ts
2
+ import type { SqlSeachOptions } from '../select-sql'
2
3
  import type { Backend } from './backend'
3
4
  import type { Where } from './where'
4
5
 
@@ -27,13 +28,7 @@ export interface DbOptions<Document extends DocType> {
27
28
  readonly disablePragmaOptimization?: boolean
28
29
  }
29
30
 
30
- export interface SearchOptions<Document extends DocType, Selected = Document> {
31
- readonly sortBy?: DotPath<Document>
32
- readonly order?: 'asc' | 'desc'
33
- readonly limit?: number
34
- readonly offset?: number
35
- readonly where?: Where<Document>
36
- readonly stepSize?: number
31
+ export interface SearchOptions<Document extends DocType, Selected = Document> extends SqlSeachOptions<Document> {
37
32
  readonly select?: (document: Document, meta: { rowId: number }) => Selected
38
33
  }
39
34
 
package/src/types.ts CHANGED
@@ -22,7 +22,7 @@ export interface GetState<T, IsFroMPromise extends boolean = false> {
22
22
  /**
23
23
  * Get the unique id of the state.
24
24
  */
25
- id: number
25
+ id: string
26
26
  /**
27
27
  * Emitter to listen to changes with snapshots.
28
28
  */
@@ -0,0 +1,9 @@
1
+ let stateId = 0
2
+ /**
3
+ * Get a unique state ID
4
+ * @returns The unique state ID
5
+ */
6
+ export function getId(): string {
7
+ stateId++
8
+ return stateId.toString(36)
9
+ }
@@ -1,10 +1,10 @@
1
1
  import type { GetState } from '../types';
2
2
  import type { SyncTable } from './create-sqlite';
3
- import type { DocType } from './table/table.types';
3
+ import type { DocType, DotPath } from './table/table.types';
4
4
  import type { Where } from './table/where';
5
5
  export type CreateState<Document, Params extends unknown[]> = (...params: Params) => GetState<Document[]>;
6
6
  export interface SqlSeachOptions<Document extends DocType> {
7
- readonly sorBy?: keyof Document;
7
+ readonly sortBy?: DotPath<Document>;
8
8
  readonly order?: 'asc' | 'desc';
9
9
  readonly limit?: number;
10
10
  readonly offset?: number;
@@ -1,3 +1,4 @@
1
+ import type { SqlSeachOptions } from '../select-sql';
1
2
  import type { Backend } from './backend';
2
3
  import type { Where } from './where';
3
4
  export type DocType = {
@@ -16,13 +17,7 @@ export interface DbOptions<Document extends DocType> {
16
17
  readonly key?: DotPath<Document>;
17
18
  readonly disablePragmaOptimization?: boolean;
18
19
  }
19
- export interface SearchOptions<Document extends DocType, Selected = Document> {
20
- readonly sortBy?: DotPath<Document>;
21
- readonly order?: 'asc' | 'desc';
22
- readonly limit?: number;
23
- readonly offset?: number;
24
- readonly where?: Where<Document>;
25
- readonly stepSize?: number;
20
+ export interface SearchOptions<Document extends DocType, Selected = Document> extends SqlSeachOptions<Document> {
26
21
  readonly select?: (document: Document, meta: {
27
22
  rowId: number;
28
23
  }) => Selected;
package/types/types.d.ts CHANGED
@@ -19,7 +19,7 @@ export interface GetState<T, IsFroMPromise extends boolean = false> {
19
19
  /**
20
20
  * Get the unique id of the state.
21
21
  */
22
- id: number;
22
+ id: string;
23
23
  /**
24
24
  * Emitter to listen to changes with snapshots.
25
25
  */
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Get a unique state ID
3
+ * @returns The unique state ID
4
+ */
5
+ export declare function getId(): string;