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 +24 -12
- package/dist/index.es.js +3 -11
- package/dist/index.umd.js +1 -1
- package/dist/types.d.ts +4 -4
- package/package.json +2 -2
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,
|
|
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
|
|
18
|
-
const fetchData:
|
|
19
|
-
(id: number) =>
|
|
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, {
|
|
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
|
|
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);
|
|
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)
|
|
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
|
|
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>) =>
|
|
26
|
+
target: <Result, Err = Error>(fn: ChainFn<Output, Result>) => ActionTarget<Input, Result, Output, Err>;
|
|
27
27
|
}
|
|
28
|
-
export interface
|
|
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: <
|
|
46
|
+
map: <Mapped>(mapper: (state: State) => Mapped) => ReadStore<Mapped>;
|
|
47
47
|
}
|
|
48
48
|
export {};
|
package/package.json
CHANGED