@asaidimu/react-store 3.0.0 → 4.0.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/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("react"),t=require("@asaidimu/utils-store"),r=class{executions=[];maxHistory=100;listeners=new Set;track(e){this.executions.unshift(e),this.executions.length>this.maxHistory&&this.executions.pop(),this.notify()}getExecutions(){return[...this.executions]}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(){this.listeners.forEach((e=>e()))}};exports.createStore=function(s,{enableMetrics:n,...a}={}){const i=new t.ReactiveDataStore(s.state,a.persistence),c=Object.keys(s.actions).reduce(((e,t)=>(e[t]=!1,e)),{}),o=new t.ReactiveDataStore(c),u=n?new t.StoreObserver(i,a):void 0,d=n?new r:void 0;n&&d&&(i.on("action:start",(({name:e})=>{o.set((()=>({[e]:!0})))})),i.on("action:complete",(e=>{o.set((()=>({[e.name]:!1}))),d.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"success",result:e.result})})),i.on("action:error",(e=>{o.set((()=>({[e.name]:!1}))),d.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"error",error:e.error})}))),s.middleware&&Object.entries(s.middleware).forEach((([e,t])=>i.use({name:e,action:t}))),s.blockingMiddleware&&Object.entries(s.blockingMiddleware).forEach((([e,t])=>i.use({block:!0,name:e,action:t})));const l=e=>(i.isReady()&&e(),i.on("persistence:ready",e)),m=()=>i.isReady(),h=new t.ArtifactContainer(i);s.artifacts&&Object.entries(s.artifacts).forEach((([e,t])=>{h.register({key:e,factory:t.factory,scope:t.scope,lazy:t.lazy})}));const y=Object.entries(s.actions).reduce(((e,[t,r])=>(i.register({name:t,fn:(e,...t)=>{const s={state:e,resolve:h.resolve.bind(h)};return r(s,...t)}}),e[t]=(...e)=>i.dispatch(t,...e),e)),{});return function(){const t=()=>e.useSyncExternalStore((e=>i.watch("",e)),(()=>i.get()),(()=>i.get())),r=e.useSyncExternalStore(l,m,m);return{store:i,observer:u,select:t=>{const r=i.select(t);return e.useSyncExternalStore((e=>r.subscribe(e)),(()=>r.get()),(()=>r.get()))},actions:y,isReady:r,actionTracker:d,watch:t=>e.useSyncExternalStore((e=>o.watch(t,e)),(()=>!!o.get()[t]),(()=>!!o.get()[t])),resolve:t=>{const r=e.useSyncExternalStore((e=>h.subscribeToArtifact(t,e)),(()=>h.get(t)),(()=>h.get(t)));e.useEffect((()=>{void 0!==r||h.isLoading(t)||h.resolve(t).catch(console.error)}),[t,r]);return[r,null!=r]},get state(){return t}}}};
1
+ "use strict";var e=require("react"),t=require("@asaidimu/utils-store"),r=class{executions=[];maxHistory=100;listeners=new Set;track(e){this.executions.unshift(e),this.executions.length>this.maxHistory&&this.executions.pop(),this.notify()}getExecutions(){return[...this.executions]}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(){this.listeners.forEach((e=>e()))}};exports.createStore=function(s,{enableMetrics:a,...n}={}){const i=new t.ReactiveDataStore(s.state,n.persistence),o=Object.keys(s.actions).reduce(((e,t)=>(e[t]=!1,e)),{}),c=new t.ReactiveDataStore(o),u=a?new t.StoreObserver(i,n):void 0,l=a?new r:void 0;a&&l&&(i.on("action:start",(({name:e})=>{c.set((()=>({[e]:!0})))})),i.on("action:complete",(e=>{c.set((()=>({[e.name]:!1}))),l.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"success",result:e.result})})),i.on("action:error",(e=>{c.set((()=>({[e.name]:!1}))),l.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"error",error:e.error})})));const d=e=>(i.isReady()&&e(),i.on("persistence:ready",e)),m=()=>i.isReady(),f=new t.ArtifactContainer(i),h=f.resolve.bind(f);s.artifacts&&Object.entries(s.artifacts).forEach((([e,t])=>{f.register({key:e,factory:t.factory,scope:t.scope,lazy:t.lazy})})),s.transform&&Object.entries(s.transform).forEach((([e,t])=>{i.use({name:e,action:(e,r)=>t({state:e,resolve:h},r)})})),s.validate&&Object.entries(s.validate).forEach((([e,t])=>{i.use({block:!0,name:e,action:(e,r)=>t({state:e,resolve:h},r)})}));const y=Object.entries(s.actions).reduce(((e,[t,r])=>(i.register({name:t,fn:(e,...t)=>r({state:e,resolve:h},...t)}),e[t]=(...e)=>i.dispatch(t,...e),e)),{});return function(){const t=()=>e.useSyncExternalStore((e=>i.watch("",e)),(()=>i.get()),(()=>i.get())),r=e.useSyncExternalStore(d,m,m);return{store:i,observer:u,select:t=>{const r=i.select(t);return e.useSyncExternalStore((e=>r.subscribe(e)),(()=>r.get()),(()=>r.get()))},actions:y,isReady:r,actionTracker:l,watch:t=>e.useSyncExternalStore((e=>c.watch(t,e)),(()=>!!c.get()[t]),(()=>!!c.get()[t])),resolve:t=>{const r=e.useSyncExternalStore((e=>f.subscribeToArtifact(t,e)),(()=>f.get(t)),(()=>f.get(t)));e.useEffect((()=>{void 0!==r||f.isLoading(t)||f.resolve(t).catch(console.error)}),[t,r]);return[r,null!=r]},get state(){return t}}}};
package/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SimplePersistence } from '@asaidimu/utils-persistence';
2
- import { DeepPartial, ArtifactFactory, ArtifactScope, ObserverOptions, BlockingMiddleware, Middleware } from '@asaidimu/utils-store';
2
+ import { ArtifactScope as ArtifactScope$1, DeepPartial, ArtifactFactory, ObserverOptions } from '@asaidimu/utils-store';
3
3
 
4
4
  interface ActionContext<TState extends object, TResolvedArtifacts extends object> {
5
5
  /**
@@ -9,6 +9,7 @@ interface ActionContext<TState extends object, TResolvedArtifacts extends object
9
9
  resolve<K extends keyof TResolvedArtifacts>(key: K): Promise<TResolvedArtifacts[K]>;
10
10
  state: TState;
11
11
  }
12
+ type ArtifactScope = ArtifactScope$1;
12
13
  type ActionImplementation<TState extends object, TResolvedArtifacts extends object, TArgs extends any[]> = (ctx: ActionContext<TState, TResolvedArtifacts>, ...args: TArgs) => DeepPartial<TState> | Promise<DeepPartial<TState>>;
13
14
  type ArtifactDefinition<TState extends Object, R> = {
14
15
  factory: ArtifactFactory<TState, R>;
@@ -35,14 +36,16 @@ type StoreOptions<T> = ObserverOptions & {
35
36
  enableMetrics?: boolean;
36
37
  persistence?: SimplePersistence<T>;
37
38
  };
39
+ type Transformer<S extends object, A extends ArtifactsMap<S>> = (ctx: ActionContext<S, A>, update: DeepPartial<S>) => Promise<DeepPartial<S>> | Promise<void> | DeepPartial<S> | void;
40
+ type Validator<S extends object, A extends ArtifactsMap<S>> = (ctx: ActionContext<S, A>, update: DeepPartial<S>) => Promise<boolean> | boolean;
38
41
  interface StoreDefinition<TState extends object, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>> {
39
42
  state: TState;
40
43
  actions: TActions;
41
44
  artifacts?: TArtifactsMap;
42
45
  loading?: LoadingState<TActions>;
43
46
  sync?: (args: TState) => void;
44
- blockingMiddleware?: Record<string, BlockingMiddleware<TState>>;
45
- middleware?: Record<string, Middleware<TState>>;
47
+ transform?: Record<string, Transformer<TState, TArtifactsMap>>;
48
+ validate?: Record<string, Transformer<TState, TArtifactsMap>>;
46
49
  }
47
50
  type StoreHook<TState extends object, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>> = () => {
48
51
  store: any;
@@ -62,4 +65,4 @@ type StoreHook<TState extends object, TArtifactsMap extends ArtifactsMap<TState>
62
65
 
63
66
  declare function createStore<TState extends Record<string, unknown>, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>>(definition: StoreDefinition<TState, TArtifactsMap, TActions>, { enableMetrics, ...options }?: StoreOptions<TState>): StoreHook<TState, TArtifactsMap, TActions>;
64
67
 
65
- export { type ActionContext, type ActionImplementation, type ActionMap, type ArtifactDefinition, type ArtifactsMap, type BoundActions, type ExtractArtifactInstanceFromConfig, type ExtractInstanceFromMap, type LoadingState, type ResolvedArtifactsMap, type StoreDefinition, type StoreHook, type StoreOptions, createStore };
68
+ export { type ActionContext, type ActionImplementation, type ActionMap, type ArtifactDefinition, type ArtifactScope, type ArtifactsMap, type BoundActions, type ExtractArtifactInstanceFromConfig, type ExtractInstanceFromMap, type LoadingState, type ResolvedArtifactsMap, type StoreDefinition, type StoreHook, type StoreOptions, type Transformer, type Validator, createStore };
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { SimplePersistence } from '@asaidimu/utils-persistence';
2
- import { DeepPartial, ArtifactFactory, ArtifactScope, ObserverOptions, BlockingMiddleware, Middleware } from '@asaidimu/utils-store';
2
+ import { ArtifactScope as ArtifactScope$1, DeepPartial, ArtifactFactory, ObserverOptions } from '@asaidimu/utils-store';
3
3
 
4
4
  interface ActionContext<TState extends object, TResolvedArtifacts extends object> {
5
5
  /**
@@ -9,6 +9,7 @@ interface ActionContext<TState extends object, TResolvedArtifacts extends object
9
9
  resolve<K extends keyof TResolvedArtifacts>(key: K): Promise<TResolvedArtifacts[K]>;
10
10
  state: TState;
11
11
  }
12
+ type ArtifactScope = ArtifactScope$1;
12
13
  type ActionImplementation<TState extends object, TResolvedArtifacts extends object, TArgs extends any[]> = (ctx: ActionContext<TState, TResolvedArtifacts>, ...args: TArgs) => DeepPartial<TState> | Promise<DeepPartial<TState>>;
13
14
  type ArtifactDefinition<TState extends Object, R> = {
14
15
  factory: ArtifactFactory<TState, R>;
@@ -35,14 +36,16 @@ type StoreOptions<T> = ObserverOptions & {
35
36
  enableMetrics?: boolean;
36
37
  persistence?: SimplePersistence<T>;
37
38
  };
39
+ type Transformer<S extends object, A extends ArtifactsMap<S>> = (ctx: ActionContext<S, A>, update: DeepPartial<S>) => Promise<DeepPartial<S>> | Promise<void> | DeepPartial<S> | void;
40
+ type Validator<S extends object, A extends ArtifactsMap<S>> = (ctx: ActionContext<S, A>, update: DeepPartial<S>) => Promise<boolean> | boolean;
38
41
  interface StoreDefinition<TState extends object, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>> {
39
42
  state: TState;
40
43
  actions: TActions;
41
44
  artifacts?: TArtifactsMap;
42
45
  loading?: LoadingState<TActions>;
43
46
  sync?: (args: TState) => void;
44
- blockingMiddleware?: Record<string, BlockingMiddleware<TState>>;
45
- middleware?: Record<string, Middleware<TState>>;
47
+ transform?: Record<string, Transformer<TState, TArtifactsMap>>;
48
+ validate?: Record<string, Transformer<TState, TArtifactsMap>>;
46
49
  }
47
50
  type StoreHook<TState extends object, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>> = () => {
48
51
  store: any;
@@ -62,4 +65,4 @@ type StoreHook<TState extends object, TArtifactsMap extends ArtifactsMap<TState>
62
65
 
63
66
  declare function createStore<TState extends Record<string, unknown>, TArtifactsMap extends ArtifactsMap<TState>, TActions extends ActionMap<TState, TArtifactsMap>>(definition: StoreDefinition<TState, TArtifactsMap, TActions>, { enableMetrics, ...options }?: StoreOptions<TState>): StoreHook<TState, TArtifactsMap, TActions>;
64
67
 
65
- export { type ActionContext, type ActionImplementation, type ActionMap, type ArtifactDefinition, type ArtifactsMap, type BoundActions, type ExtractArtifactInstanceFromConfig, type ExtractInstanceFromMap, type LoadingState, type ResolvedArtifactsMap, type StoreDefinition, type StoreHook, type StoreOptions, createStore };
68
+ export { type ActionContext, type ActionImplementation, type ActionMap, type ArtifactDefinition, type ArtifactScope, type ArtifactsMap, type BoundActions, type ExtractArtifactInstanceFromConfig, type ExtractInstanceFromMap, type LoadingState, type ResolvedArtifactsMap, type StoreDefinition, type StoreHook, type StoreOptions, type Transformer, type Validator, createStore };
package/index.js CHANGED
@@ -1 +1 @@
1
- import{useSyncExternalStore as e,useEffect as t}from"react";import{ReactiveDataStore as s,StoreObserver as r,ArtifactContainer as i}from"@asaidimu/utils-store";var n=class{executions=[];maxHistory=100;listeners=new Set;track(e){this.executions.unshift(e),this.executions.length>this.maxHistory&&this.executions.pop(),this.notify()}getExecutions(){return[...this.executions]}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(){this.listeners.forEach((e=>e()))}};function a(a,{enableMetrics:o,...c}={}){const d=new s(a.state,c.persistence),u=Object.keys(a.actions).reduce(((e,t)=>(e[t]=!1,e)),{}),m=new s(u),l=o?new r(d,c):void 0,h=o?new n:void 0;o&&h&&(d.on("action:start",(({name:e})=>{m.set((()=>({[e]:!0})))})),d.on("action:complete",(e=>{m.set((()=>({[e.name]:!1}))),h.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"success",result:e.result})})),d.on("action:error",(e=>{m.set((()=>({[e.name]:!1}))),h.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"error",error:e.error})}))),a.middleware&&Object.entries(a.middleware).forEach((([e,t])=>d.use({name:e,action:t}))),a.blockingMiddleware&&Object.entries(a.blockingMiddleware).forEach((([e,t])=>d.use({block:!0,name:e,action:t})));const b=e=>(d.isReady()&&e(),d.on("persistence:ready",e)),f=()=>d.isReady(),g=new i(d);a.artifacts&&Object.entries(a.artifacts).forEach((([e,t])=>{g.register({key:e,factory:t.factory,scope:t.scope,lazy:t.lazy})}));const p=Object.entries(a.actions).reduce(((e,[t,s])=>(d.register({name:t,fn:(e,...t)=>{const r={state:e,resolve:g.resolve.bind(g)};return s(r,...t)}}),e[t]=(...e)=>d.dispatch(t,...e),e)),{});return function(){const s=()=>e((e=>d.watch("",e)),(()=>d.get()),(()=>d.get())),r=e(b,f,f);return{store:d,observer:l,select:t=>{const s=d.select(t);return e((e=>s.subscribe(e)),(()=>s.get()),(()=>s.get()))},actions:p,isReady:r,actionTracker:h,watch:t=>e((e=>m.watch(t,e)),(()=>!!m.get()[t]),(()=>!!m.get()[t])),resolve:s=>{const r=e((e=>g.subscribeToArtifact(s,e)),(()=>g.get(s)),(()=>g.get(s)));t((()=>{void 0!==r||g.isLoading(s)||g.resolve(s).catch(console.error)}),[s,r]);return[r,null!=r]},get state(){return s}}}}export{a as createStore};
1
+ import{useSyncExternalStore as e,useEffect as t}from"react";import{ReactiveDataStore as s,StoreObserver as r,ArtifactContainer as a}from"@asaidimu/utils-store";var n=class{executions=[];maxHistory=100;listeners=new Set;track(e){this.executions.unshift(e),this.executions.length>this.maxHistory&&this.executions.pop(),this.notify()}getExecutions(){return[...this.executions]}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(){this.listeners.forEach((e=>e()))}};function i(i,{enableMetrics:o,...c}={}){const u=new s(i.state,c.persistence),m=Object.keys(i.actions).reduce(((e,t)=>(e[t]=!1,e)),{}),d=new s(m),l=o?new r(u,c):void 0,h=o?new n:void 0;o&&h&&(u.on("action:start",(({name:e})=>{d.set((()=>({[e]:!0})))})),u.on("action:complete",(e=>{d.set((()=>({[e.name]:!1}))),h.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"success",result:e.result})})),u.on("action:error",(e=>{d.set((()=>({[e.name]:!1}))),h.track({id:e.actionId,name:e.name,params:e.params,startTime:e.startTime,endTime:e.endTime,duration:e.duration,status:"error",error:e.error})})));const f=e=>(u.isReady()&&e(),u.on("persistence:ready",e)),b=()=>u.isReady(),p=new a(u),g=p.resolve.bind(p);i.artifacts&&Object.entries(i.artifacts).forEach((([e,t])=>{p.register({key:e,factory:t.factory,scope:t.scope,lazy:t.lazy})})),i.transform&&Object.entries(i.transform).forEach((([e,t])=>{u.use({name:e,action:(e,s)=>t({state:e,resolve:g},s)})})),i.validate&&Object.entries(i.validate).forEach((([e,t])=>{u.use({block:!0,name:e,action:(e,s)=>t({state:e,resolve:g},s)})}));const y=Object.entries(i.actions).reduce(((e,[t,s])=>(u.register({name:t,fn:(e,...t)=>s({state:e,resolve:g},...t)}),e[t]=(...e)=>u.dispatch(t,...e),e)),{});return function(){const s=()=>e((e=>u.watch("",e)),(()=>u.get()),(()=>u.get())),r=e(f,b,b);return{store:u,observer:l,select:t=>{const s=u.select(t);return e((e=>s.subscribe(e)),(()=>s.get()),(()=>s.get()))},actions:y,isReady:r,actionTracker:h,watch:t=>e((e=>d.watch(t,e)),(()=>!!d.get()[t]),(()=>!!d.get()[t])),resolve:s=>{const r=e((e=>p.subscribeToArtifact(s,e)),(()=>p.get(s)),(()=>p.get(s)));t((()=>{void 0!==r||p.isLoading(s)||p.resolve(s).catch(console.error)}),[s,r]);return[r,null!=r]},get state(){return s}}}}export{i as createStore};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asaidimu/react-store",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "Efficient react state manager.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",