@vanyamate/sec 0.0.9 → 0.1.1

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
@@ -2,6 +2,10 @@
2
2
 
3
3
  Tiny state manager
4
4
 
5
+ ```
6
+ npm i @vanyamate/sec
7
+ ```
8
+
5
9
  ```typescript
6
10
  import { store, effect, combine } from './index';
7
11
 
package/index.d.ts CHANGED
@@ -3,20 +3,22 @@ export type EffectEvent = 'onBefore' | 'onSuccess' | 'onError' | 'onFinally';
3
3
  export type Effect<Args extends any[], Result> = {
4
4
  (...args: Args): Promise<Result>;
5
5
  onSuccess: (callback: (result: Result, ...args: Args) => void) => void;
6
- onError: (callback: (error: any, ...args: Args) => void) => void;
6
+ onError: (callback: (error: unknown, ...args: Args) => void) => void;
7
7
  onFinally: (callback: (...args: Args) => void) => void;
8
8
  onBefore: (callback: (...args: Args) => void) => void;
9
9
  };
10
10
  export type Listener<State> = (state: State) => void;
11
+ export type Payload<Result, Args> = {
12
+ result?: Result;
13
+ error?: unknown;
14
+ args: Args;
15
+ };
16
+ export type Handler<State, Args, Result> = (state: State, payload: Payload<Result, Args>) => State;
11
17
  export declare function effect<Args extends any[], Result>(fn: EffectFunction<Args, Result>): Effect<Args, Result>;
12
18
  export type Store<State> = {
13
19
  get: () => State;
14
20
  set: (newState: State) => void;
15
- on: <Args extends any[], Result>(effect: Effect<Args, Result>, event: EffectEvent, handler: (state: State, payload: {
16
- result?: Result;
17
- error?: any;
18
- meta: Args;
19
- }) => State) => Store<State>;
21
+ on: <Args extends any[], Result>(effect: Effect<Args, Result>, event: EffectEvent, handler: Handler<State, Args, Result>) => Store<State>;
20
22
  subscribe: (listener: Listener<State>) => () => void;
21
23
  };
22
24
  export declare function store<State>(initialState: State): Store<State>;
package/index.ts CHANGED
@@ -4,20 +4,26 @@ export type EffectEvent = 'onBefore' | 'onSuccess' | 'onError' | 'onFinally';
4
4
  export type Effect<Args extends any[], Result> = {
5
5
  (...args: Args): Promise<Result>;
6
6
  onSuccess: (callback: (result: Result, ...args: Args) => void) => void;
7
- onError: (callback: (error: any, ...args: Args) => void) => void;
7
+ onError: (callback: (error: unknown, ...args: Args) => void) => void;
8
8
  onFinally: (callback: (...args: Args) => void) => void;
9
9
  onBefore: (callback: (...args: Args) => void) => void;
10
10
  };
11
11
 
12
12
  export type Listener<State> = (state: State) => void;
13
+ export type Payload<Result, Args> = {
14
+ result?: Result;
15
+ error?: unknown;
16
+ args: Args;
17
+ };
18
+ export type Handler<State, Args, Result> = (state: State, payload: Payload<Result, Args>) => State;
13
19
 
14
20
  export function effect<Args extends any[], Result> (fn: EffectFunction<Args, Result>): Effect<Args, Result> {
15
21
  let beforeListeners: ((...args: Args) => void)[] = [];
16
22
  let successListeners: ((result: Result, ...args: Args) => void)[] = [];
17
- let errorListeners: ((error: any, ...args: Args) => void)[] = [];
23
+ let errorListeners: ((error: unknown, ...args: Args) => void)[] = [];
18
24
  let finallyListeners: ((...args: Args) => void)[] = [];
19
25
 
20
- const wrappedEffect: any = async (...args: Args) => {
26
+ const wrappedEffect: Effect<Args, Result> = async (...args: Args) => {
21
27
  beforeListeners.forEach(listener => listener(...args));
22
28
  try {
23
29
  const result = await fn(...args);
@@ -39,7 +45,7 @@ export function effect<Args extends any[], Result> (fn: EffectFunction<Args, Res
39
45
  successListeners.push(callback);
40
46
  };
41
47
 
42
- wrappedEffect.onError = (callback: (error: any, ...args: Args) => void) => {
48
+ wrappedEffect.onError = (callback: (error: unknown, ...args: Args) => void) => {
43
49
  errorListeners.push(callback);
44
50
  };
45
51
 
@@ -47,7 +53,7 @@ export function effect<Args extends any[], Result> (fn: EffectFunction<Args, Res
47
53
  finallyListeners.push(callback);
48
54
  };
49
55
 
50
- return wrappedEffect as Effect<Args, Result>;
56
+ return wrappedEffect;
51
57
  }
52
58
 
53
59
  export type Store<State> = {
@@ -56,11 +62,7 @@ export type Store<State> = {
56
62
  on: <Args extends any[], Result>(
57
63
  effect: Effect<Args, Result>,
58
64
  event: EffectEvent,
59
- handler: (state: State, payload: {
60
- result?: Result;
61
- error?: any;
62
- meta: Args
63
- }) => State,
65
+ handler: Handler<State, Args, Result>,
64
66
  ) => Store<State>;
65
67
  subscribe: (listener: Listener<State>) => () => void;
66
68
  };
@@ -78,29 +80,21 @@ export function store<State> (initialState: State): Store<State> {
78
80
  const on = <Args extends any[], Result> (
79
81
  effect: Effect<Args, Result>,
80
82
  event: EffectEvent,
81
- handler: (state: State, payload: {
82
- result?: Result;
83
- error?: any;
84
- meta: Args
85
- }) => State,
83
+ handler: Handler<State, Args, Result>,
86
84
  ): Store<State> => {
87
- const callback = (payload: {
88
- result?: Result;
89
- error?: any;
90
- meta: Args
91
- }) => set(handler(state, payload));
85
+ const callback = (payload: Payload<Result, Args>) => set(handler(state, payload));
92
86
 
93
87
  if (event === 'onBefore') {
94
- effect.onBefore((...args) => callback({ meta: args }));
88
+ effect.onBefore((...args) => callback({ args }));
95
89
  } else if (event === 'onSuccess') {
96
90
  effect.onSuccess((result, ...args) => callback({
97
91
  result,
98
- meta: args,
92
+ args,
99
93
  }));
100
94
  } else if (event === 'onError') {
101
- effect.onError((error, ...args) => callback({ error, meta: args }));
95
+ effect.onError((error, ...args) => callback({ error, args }));
102
96
  } else if (event === 'onFinally') {
103
- effect.onFinally((...args) => callback({ meta: args }));
97
+ effect.onFinally((...args) => callback({ args }));
104
98
  }
105
99
 
106
100
  return storeApi;
@@ -108,7 +102,12 @@ export function store<State> (initialState: State): Store<State> {
108
102
 
109
103
  const subscribe = (listener: Listener<State>) => {
110
104
  listeners.push(listener);
111
- return () => listeners = listeners.filter((l) => l !== listener);
105
+ return () => {
106
+ const index = listeners.indexOf(listener);
107
+ if (index !== -1) {
108
+ listeners.splice(index, 1);
109
+ }
110
+ };
112
111
  };
113
112
 
114
113
  const storeApi = {
@@ -127,7 +126,7 @@ export function combine<States extends any[], Result> (
127
126
  ): Store<Result> {
128
127
  let combinedState: Result = callback(...stores);
129
128
 
130
- stores.forEach((store, index) => {
129
+ stores.forEach((store) => {
131
130
  store.subscribe(() => {
132
131
  combinedState = callback(...stores);
133
132
  listeners.forEach(listener => listener(combinedState));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vanyamate/sec",
3
- "version": "0.0.9",
3
+ "version": "0.1.1",
4
4
  "description": "SEC. Store, Effect, Combine. Tiny state manager",
5
5
  "scripts": {
6
6
  "g:type": "tsc index.ts --declaration --emitDeclarationOnly"