chain-store 0.0.4 → 0.0.5

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/README.md CHANGED
@@ -3,26 +3,32 @@
3
3
  **A simple event-based state manager!**
4
4
 
5
5
  ```ts
6
- import { createAction } from "chain-store";
7
- import type { Action, AsyncAction } from "chain-store";
8
- import { DiagnosticsChannel } from "undici-types";
9
- import { createStore } from "./store";
10
- import Error = DiagnosticsChannel.Error;
6
+ import { createAction, createStore } from "chain-store";
7
+ import type { Action, ActionTarget, Store } from "chain-store";
11
8
 
12
9
  type ExampleData = { name: string, email: string };
13
10
 
14
11
  // Create Action:
15
12
  const getData: Action<number> = createAction<number>();
16
13
 
17
- // Create AsyncAction:
18
- const fetchData: AsyncAction<number, ExampleData> = getData.target(
19
- (id: number) => fetch(`/details/?id=${ id }`).then(res => res.json() as ExampleData)
14
+ // Create ActionTarget:
15
+ const fetchData: ActionTarget<number, ExampleData> = getData.target(
16
+ (id: number) => {
17
+ return fetch(`/details/?id=${ id }`).then(
18
+ res => res.json() as ExampleData
19
+ )
20
+ }
21
+
20
22
  );
21
23
 
22
- type State = Record<number, { loading: boolean, data: ExampleData | null, error?: string }>;
24
+ type State = Record<number, {
25
+ loading: boolean,
26
+ data: ExampleData | null,
27
+ error?: string
28
+ }>;
23
29
 
24
30
  // Create Store:
25
- const store = createStore < State >> ({})
31
+ const store: Store<State> = createStore<State>({})
26
32
  // Subscribe to watch changes
27
33
  .on(fetchData, (state: State, params: number) => ({
28
34
  ...state,
@@ -37,8 +43,14 @@ const store = createStore < State >> ({})
37
43
  [params]: { data: null, loading: false, error: error.name }
38
44
  }));
39
45
 
40
- // Trigger
41
- getData(1); /* or fetchData(1) */
46
+ // Trigger Action
47
+ getData(1);
48
+
49
+ // Or trigger ActionTarget if you need to execute something when it's completed.
50
+ fetchData(1)
51
+ .done((result: ExampleData, params: number) => console.log(result, params))
52
+ .fail((error: Error, params: number) => console.log(error.name, params))
53
+ .finish((params: number) => console.log(params));
42
54
 
43
55
  ```
44
56
 
package/dist/index.es.js CHANGED
@@ -27,9 +27,7 @@ var e = () => n(), t = (e) => {
27
27
  return c;
28
28
  }, n = (e, t, a, o) => {
29
29
  let s = {}, l = [], u = (e, t, n) => {
30
- s.emit?.(e);
31
- for (let r of l) t.push(() => r(e, t, n));
32
- for (let e = 0; e < l.length; e++) t.splice(0, 1)[0]();
30
+ s.emit?.(e), l.forEach((r) => t.push(() => r(e, t, n))), l.forEach(() => t.splice(0, 1)[0]());
33
31
  }, f = (e, t, n) => {
34
32
  try {
35
33
  if (a) return i(e, a, (e) => u(e, t, n));
@@ -95,11 +93,7 @@ var e = () => n(), t = (e) => {
95
93
  [r]: (...e) => {
96
94
  n.stored[i] = e[0], i < 2 && n.set(r), t[r]?.(...e);
97
95
  }
98
- }), {}), i = (e, r) => ({ [e]: t[e] ? void 0 : (i) => {
99
- t[e] = i;
100
- let a = [n.stored[r]];
101
- return r < 2 && a.push(n.stored[2]), n.state !== "pending" && i(...a), o(n, t).methods;
102
- } });
96
+ }), {}), i = (e, r) => ({ [e]: t[e] ? void 0 : (i) => (t[e] = i, n.state !== "pending" && i(n.stored[r], ...r < 2 ? [n.stored[2]] : []), o(n, t).methods) });
103
97
  return {
104
98
  events: r,
105
99
  methods: Object.assign(n.controller, a.reduce((e, t, n) => ({
@@ -121,9 +115,7 @@ var e = () => n(), t = (e) => {
121
115
  }, u = (e) => (async () => void 0)().then(e).catch(() => void 0), d = (e) => (t) => {
122
116
  if (e?.watch) return e.watch(t);
123
117
  let n = [], r = (e) => l(n, e), i = (e) => !n.includes(e) && n.push(e);
124
- return e.watch = (e) => (i(e), { dispose: () => r(e) }), e.emit = (...e) => {
125
- for (let t of n) t(...e);
126
- }, e.watch(t);
118
+ return e.watch = (e) => (i(e), { dispose: () => r(e) }), e.emit = (...e) => n.forEach((t) => t(...e)), e.watch(t);
127
119
  };
128
120
  //#endregion
129
121
  export { e as createAction, t as createStore };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`chain-store`]={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=()=>r(),n=e=>{let t=[],n=[],r={},i=[],a=!1,o=e,s=e=>u(t,void 0,t=>t[0]===e)?.[1].dispose(),c={on:(e,l)=>(s(e),t.push([e,e.watch((...e)=>{a=!0;let t=n.map(([e])=>e(o)),s=l(o,...e);s!==o&&(o=s,r.emit?.(o));for(let e=0;e<n.length;e++){let r=n[e][0](o);r!==t[e]&&n[e][1](r)}a=!1;for(let e of i)e();i=[]})]),c),off:e=>(s(e),c),map:e=>({getState:()=>e(o),watch:t=>(n.push([e,t]),{dispose:()=>{let r=()=>u(n,void 0,([n,r])=>n===e&&r===t);a?i.push(r):r()}})}),getState:()=>o,watch:f(r)};return c},r=(e,t,n,o)=>{let s={},c=[],u=(e,t,n)=>{s.emit?.(e);for(let r of c)t.push(()=>r(e,t,n));for(let e=0;e<c.length;e++)t.splice(0,1)[0]()},d=(e,t,r)=>{try{if(n)return a(e,n,e=>u(e,t,r));if(o)return a(e,o,n=>n&&u(e,t,r));u(e,t,r)}catch{}};return t?.(d),Object.assign(t=>{(e??d)(t,[])},{watch:f(s),map:t=>r(e??d,l(c),t),filter:t=>r(e??d,l(c),void 0,t),target:(t,n)=>i(e??d,l(c),t,n)})},i=(e,t,n,r)=>{let i={},a={},o={},c={},l=[],p=async(e,t)=>{let s=n(e),f=t?.(m);if(!(s instanceof Promise))return i.emit?.(e),d(()=>{a.emit?.(s,e),f?.done(s,e)});let p=l.includes(s),h=r?.skipDuplicates!==!1;!p&&h&&l.push(s),(!p||!h)&&i.emit?.(e);try{let t=await s;(!p||!h)&&a.emit?.(t,e),f?.done(t,e)}catch(t){(!p||!h)&&o.emit?.(t,e),f?.fail(t,e)}finally{!p||!h?c.emit?.(e):d(()=>u(l,s)),f?.finish(e)}},m=(e,t,n)=>{try{d(()=>p(e,n))}catch{}};return t(m),Object.assign(t=>{let{events:n,methods:r}=s();return e(t,[],e=>e===m?n:void 0),r},{watch:f(i),done:{watch:f(a)},fail:{watch:f(o)},finish:{watch:f(c)}})},a=(e,t,n)=>{if(!t)return n(e);let r=t(e);if(!(r instanceof Promise))return n(r);r.then(n).catch(()=>void 0)},o=[`done`,`fail`,`finish`],s=(e,t={})=>{let n=e??{state:`pending`,stored:[],set:e=>n.state=e,controller:new c(()=>n.state)},r=o.reduce((e,r,i)=>({...e,[r]:(...e)=>{n.stored[i]=e[0],i<2&&n.set(r),t[r]?.(...e)}}),{}),i=(e,r)=>({[e]:t[e]?void 0:i=>{t[e]=i;let a=[n.stored[r]];return r<2&&a.push(n.stored[2]),n.state!==`pending`&&i(...a),s(n,t).methods}});return{events:r,methods:Object.assign(n.controller,o.reduce((e,t,n)=>({...e,...i(t,n)}),{}))}},c=class{getState;constructor(e){this.getState=e}get state(){return this.getState()}},l=e=>t=>e.push(t),u=(e,t,n)=>{let r=e.findIndex(n??(e=>t===e));return r>=0?e.splice(r,1)[0]:void 0},d=e=>(async()=>void 0)().then(e).catch(()=>void 0),f=e=>t=>{if(e?.watch)return e.watch(t);let n=[],r=e=>u(n,e),i=e=>!n.includes(e)&&n.push(e);return e.watch=e=>(i(e),{dispose:()=>r(e)}),e.emit=(...e)=>{for(let t of n)t(...e)},e.watch(t)};e.createAction=t,e.createStore=n});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`chain-store`]={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=()=>r(),n=e=>{let t=[],n=[],r={},i=[],a=!1,o=e,s=e=>u(t,void 0,t=>t[0]===e)?.[1].dispose(),c={on:(e,l)=>(s(e),t.push([e,e.watch((...e)=>{a=!0;let t=n.map(([e])=>e(o)),s=l(o,...e);s!==o&&(o=s,r.emit?.(o));for(let e=0;e<n.length;e++){let r=n[e][0](o);r!==t[e]&&n[e][1](r)}a=!1;for(let e of i)e();i=[]})]),c),off:e=>(s(e),c),map:e=>({getState:()=>e(o),watch:t=>(n.push([e,t]),{dispose:()=>{let r=()=>u(n,void 0,([n,r])=>n===e&&r===t);a?i.push(r):r()}})}),getState:()=>o,watch:f(r)};return c},r=(e,t,n,o)=>{let s={},c=[],u=(e,t,n)=>{s.emit?.(e),c.forEach(r=>t.push(()=>r(e,t,n))),c.forEach(()=>t.splice(0,1)[0]())},d=(e,t,r)=>{try{if(n)return a(e,n,e=>u(e,t,r));if(o)return a(e,o,n=>n&&u(e,t,r));u(e,t,r)}catch{}};return t?.(d),Object.assign(t=>{(e??d)(t,[])},{watch:f(s),map:t=>r(e??d,l(c),t),filter:t=>r(e??d,l(c),void 0,t),target:(t,n)=>i(e??d,l(c),t,n)})},i=(e,t,n,r)=>{let i={},a={},o={},c={},l=[],p=async(e,t)=>{let s=n(e),f=t?.(m);if(!(s instanceof Promise))return i.emit?.(e),d(()=>{a.emit?.(s,e),f?.done(s,e)});let p=l.includes(s),h=r?.skipDuplicates!==!1;!p&&h&&l.push(s),(!p||!h)&&i.emit?.(e);try{let t=await s;(!p||!h)&&a.emit?.(t,e),f?.done(t,e)}catch(t){(!p||!h)&&o.emit?.(t,e),f?.fail(t,e)}finally{!p||!h?c.emit?.(e):d(()=>u(l,s)),f?.finish(e)}},m=(e,t,n)=>{try{d(()=>p(e,n))}catch{}};return t(m),Object.assign(t=>{let{events:n,methods:r}=s();return e(t,[],e=>e===m?n:void 0),r},{watch:f(i),done:{watch:f(a)},fail:{watch:f(o)},finish:{watch:f(c)}})},a=(e,t,n)=>{if(!t)return n(e);let r=t(e);if(!(r instanceof Promise))return n(r);r.then(n).catch(()=>void 0)},o=[`done`,`fail`,`finish`],s=(e,t={})=>{let n=e??{state:`pending`,stored:[],set:e=>n.state=e,controller:new c(()=>n.state)},r=o.reduce((e,r,i)=>({...e,[r]:(...e)=>{n.stored[i]=e[0],i<2&&n.set(r),t[r]?.(...e)}}),{}),i=(e,r)=>({[e]:t[e]?void 0:i=>(t[e]=i,n.state!==`pending`&&i(n.stored[r],...r<2?[n.stored[2]]:[]),s(n,t).methods)});return{events:r,methods:Object.assign(n.controller,o.reduce((e,t,n)=>({...e,...i(t,n)}),{}))}},c=class{getState;constructor(e){this.getState=e}get state(){return this.getState()}},l=e=>t=>e.push(t),u=(e,t,n)=>{let r=e.findIndex(n??(e=>t===e));return r>=0?e.splice(r,1)[0]:void 0},d=e=>(async()=>void 0)().then(e).catch(()=>void 0),f=e=>t=>{if(e?.watch)return e.watch(t);let n=[],r=e=>u(n,e),i=e=>!n.includes(e)&&n.push(e);return e.watch=e=>(i(e),{dispose:()=>r(e)}),e.emit=(...e)=>n.forEach(t=>t(...e)),e.watch(t)};e.createAction=t,e.createStore=n});
package/dist/types.d.ts CHANGED
@@ -10,7 +10,7 @@ export type ActionPromiseEvents<Params = any, Result = any, Error = any> = {
10
10
  finish: (params: Params) => void;
11
11
  };
12
12
  export type Args<Params> = Params extends Array<unknown> ? Params : [Params];
13
- export type AsyncActionOptions = {
13
+ export type ActionTargetOptions = {
14
14
  skipDuplicates?: boolean;
15
15
  };
16
16
  export type ChainFn<Input, Output> = (params: Input) => Output | Promise<Output>;
@@ -23,9 +23,9 @@ export interface Unit<Params> {
23
23
  export interface Action<Input = void, Output = Input> extends ActionCall<Input>, Unit<Output> {
24
24
  filter: (fn: ChainFn<Output, boolean>) => Action<Input, Output>;
25
25
  map: <Mapped>(fn: ChainFn<Output, Mapped>) => Action<Input, Mapped>;
26
- target: <Result, Err = Error>(fn: ChainFn<Output, Result>) => AsyncAction<Input, Result, Output, Err>;
26
+ target: <Result, Err = Error>(fn: ChainFn<Output, Result>) => ActionTarget<Input, Result, Output, Err>;
27
27
  }
28
- export interface AsyncAction<Input, Result, Params = Input, Err = Error> extends ActionCall<Input, ActionPromise<Params, Result, Err>>, Unit<Params> {
28
+ export interface ActionTarget<Input, Result, Params = Input, Err = Error> extends ActionCall<Input, ActionPromise<Params, Result, Err>>, Unit<Params> {
29
29
  done: {
30
30
  watch: (watcher: (result: Result, params: Params) => void) => Subscription;
31
31
  };
@@ -43,6 +43,6 @@ export interface ReadStore<State> {
43
43
  export interface Store<State> extends ReadStore<State> {
44
44
  on: <T>(action: Unit<T>, f: (state: State, ...args: Args<T>) => State) => Store<State>;
45
45
  off: <T>(action: Unit<T>) => Store<State>;
46
- map: <Part>(mapper: (state: State) => Part) => ReadStore<Part>;
46
+ map: <Mapped>(mapper: (state: State) => Mapped) => ReadStore<Mapped>;
47
47
  }
48
48
  export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "chain-store",
3
- "description": "Simple event-based state manager!",
4
- "version": "0.0.4",
3
+ "description": "Simple event-based state manager",
4
+ "version": "0.0.5",
5
5
  "author": {
6
6
  "name": "Aleksandr Gurianov",
7
7
  "url": "http://golova.pro"