@vanyamate/sec 0.2.3 → 0.2.4
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/package.json +6 -1
- package/src/combine/index.ts +0 -55
- package/src/effect/index.ts +0 -115
- package/src/index.ts +0 -6
- package/src/marker/index.ts +0 -34
- package/src/marker/marker.test.ts +0 -85
- package/src/pending/index.ts +0 -13
- package/src/pending/pending.test.ts +0 -24
- package/src/store/index.ts +0 -134
- package/src/to/index.ts +0 -3
- package/src/to/to.test.ts +0 -23
- package/tsconfig.json +0 -14
- package/vite.config.ts +0 -23
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vanyamate/sec",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "SEC. Store, Effect, Combine. Tiny state manager",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "vite build",
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
"require": "./dist/index.cjs"
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"package.json",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
19
24
|
"repository": {
|
|
20
25
|
"type": "git",
|
|
21
26
|
"url": "git+https://github.com/VanyaMate/sec.git"
|
package/src/combine/index.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
enableCheck,
|
|
3
|
-
Store, StoreListener,
|
|
4
|
-
} from '../store';
|
|
5
|
-
import { Marker } from '../marker';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export const combine = function <State, States extends Array<any>> (
|
|
9
|
-
stores: { [Index in keyof States]: Store<States[Index]> },
|
|
10
|
-
callback: (...stores: { [K in keyof States]: Store<States[K]> }) => State,
|
|
11
|
-
enabled: boolean = true,
|
|
12
|
-
): Store<State> {
|
|
13
|
-
let combinedState: State = callback(...stores);
|
|
14
|
-
const listeners: Array<StoreListener<State>> = [];
|
|
15
|
-
|
|
16
|
-
stores.forEach((store) => {
|
|
17
|
-
store.subscribe(() => {
|
|
18
|
-
enableCheck(enabled, () => {
|
|
19
|
-
combinedState = callback(...stores);
|
|
20
|
-
listeners.forEach((listener) => listener(combinedState));
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
const storeApi: Store<State> = {
|
|
26
|
-
on: () => {
|
|
27
|
-
throw new Error(`Cannot call 'on' on combined store`);
|
|
28
|
-
},
|
|
29
|
-
get (): State {
|
|
30
|
-
return combinedState;
|
|
31
|
-
},
|
|
32
|
-
set () {
|
|
33
|
-
throw new Error(`Cannot call 'set' on combined store`);
|
|
34
|
-
},
|
|
35
|
-
subscribe (listener: StoreListener<State>) {
|
|
36
|
-
listeners.push(listener);
|
|
37
|
-
return () => {
|
|
38
|
-
const index = listeners.indexOf(listener);
|
|
39
|
-
if (~index) {
|
|
40
|
-
listeners.splice(index, 1);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
},
|
|
44
|
-
enableOn (marker: Marker<State>) {
|
|
45
|
-
marker.subscribe(() => enabled = false);
|
|
46
|
-
return storeApi;
|
|
47
|
-
},
|
|
48
|
-
disableOn (marker: Marker<State>) {
|
|
49
|
-
marker.subscribe(() => enabled = true);
|
|
50
|
-
return storeApi;
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
return storeApi;
|
|
55
|
-
};
|
package/src/effect/index.ts
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
export type EffectAction = (...args: Array<any>) => Promise<any>;
|
|
2
|
-
export type EffectSuccessCallback<AsyncAction extends EffectAction> = (result: Awaited<ReturnType<AsyncAction>>, ...args: Parameters<AsyncAction>) => void;
|
|
3
|
-
export type EffectErrorCallback<AsyncAction extends EffectAction> = (error: unknown, ...args: Parameters<AsyncAction>) => void;
|
|
4
|
-
export type EffectBeforeCallback<AsyncAction extends EffectAction> = (...args: Parameters<AsyncAction>) => void;
|
|
5
|
-
export type EffectFinallyCallback<AsyncAction extends EffectAction> = (...args: Parameters<AsyncAction>) => void;
|
|
6
|
-
|
|
7
|
-
export type EffectSubscribePosition =
|
|
8
|
-
'beforeAll'
|
|
9
|
-
| 'afterAll'
|
|
10
|
-
| undefined;
|
|
11
|
-
|
|
12
|
-
export type Effect<AsyncAction extends EffectAction> = {
|
|
13
|
-
(...args: Parameters<AsyncAction>): Promise<Awaited<ReturnType<AsyncAction>>>;
|
|
14
|
-
onSuccess: (callback: EffectSuccessCallback<AsyncAction>, position?: EffectSubscribePosition) => void;
|
|
15
|
-
onError: (callback: EffectErrorCallback<AsyncAction>, position?: EffectSubscribePosition) => void;
|
|
16
|
-
onBefore: (callback: EffectBeforeCallback<AsyncAction>, position?: EffectSubscribePosition) => void;
|
|
17
|
-
onFinally: (callback: EffectFinallyCallback<AsyncAction>, position?: EffectSubscribePosition) => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type EffectCallbackList<Type> = {
|
|
21
|
-
beforeAll: Array<Type>;
|
|
22
|
-
afterAll: Array<Type>;
|
|
23
|
-
other: Array<Type>;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const getCallbacksList = function <Type> (): EffectCallbackList<Type> {
|
|
27
|
-
return {
|
|
28
|
-
afterAll : [],
|
|
29
|
-
beforeAll: [],
|
|
30
|
-
other : [],
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
export const effect = function <Action extends EffectAction> (action: Action): Effect<Action> {
|
|
35
|
-
const beforeCallbacks: EffectCallbackList<EffectBeforeCallback<Action>> = getCallbacksList<EffectBeforeCallback<Action>>();
|
|
36
|
-
const successCallbacks: EffectCallbackList<EffectSuccessCallback<Action>> = getCallbacksList<EffectSuccessCallback<Action>>();
|
|
37
|
-
const errorCallbacks: EffectCallbackList<EffectErrorCallback<Action>> = getCallbacksList<EffectErrorCallback<Action>>();
|
|
38
|
-
const finallyCallbacks: EffectCallbackList<EffectFinallyCallback<Action>> = getCallbacksList<EffectFinallyCallback<Action>>();
|
|
39
|
-
|
|
40
|
-
const effectApi: Effect<Action> = async function (...args) {
|
|
41
|
-
beforeCallbacks.beforeAll.forEach((callback) => callback(...args));
|
|
42
|
-
beforeCallbacks.other.forEach((callback) => callback(...args));
|
|
43
|
-
beforeCallbacks.afterAll.forEach((callback) => callback(...args));
|
|
44
|
-
|
|
45
|
-
return action(...args)
|
|
46
|
-
.then((result: Awaited<ReturnType<Action>>) => {
|
|
47
|
-
successCallbacks.beforeAll.forEach((callback) => callback(result, ...args));
|
|
48
|
-
successCallbacks.other.forEach((callback) => callback(result, ...args));
|
|
49
|
-
successCallbacks.afterAll.forEach((callback) => callback(result, ...args));
|
|
50
|
-
return result;
|
|
51
|
-
})
|
|
52
|
-
.catch((error: unknown) => {
|
|
53
|
-
errorCallbacks.beforeAll.forEach((callback) => callback(error, ...args));
|
|
54
|
-
errorCallbacks.other.forEach((callback) => callback(error, ...args));
|
|
55
|
-
errorCallbacks.afterAll.forEach((callback) => callback(error, ...args));
|
|
56
|
-
throw error;
|
|
57
|
-
})
|
|
58
|
-
.finally(() => {
|
|
59
|
-
finallyCallbacks.beforeAll.forEach((callback) => callback(...args));
|
|
60
|
-
finallyCallbacks.other.forEach((callback) => callback(...args));
|
|
61
|
-
finallyCallbacks.afterAll.forEach((callback) => callback(...args));
|
|
62
|
-
});
|
|
63
|
-
} as Effect<Action>;
|
|
64
|
-
|
|
65
|
-
effectApi.onBefore = (callback: EffectBeforeCallback<Action>, position?: EffectSubscribePosition) => {
|
|
66
|
-
switch (position) {
|
|
67
|
-
case 'beforeAll':
|
|
68
|
-
beforeCallbacks.beforeAll.push(callback);
|
|
69
|
-
break;
|
|
70
|
-
case 'afterAll':
|
|
71
|
-
beforeCallbacks.afterAll.push(callback);
|
|
72
|
-
break;
|
|
73
|
-
default:
|
|
74
|
-
beforeCallbacks.other.push(callback);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
effectApi.onSuccess = (callback: EffectSuccessCallback<Action>, position?: EffectSubscribePosition) => {
|
|
78
|
-
switch (position) {
|
|
79
|
-
case 'beforeAll':
|
|
80
|
-
successCallbacks.beforeAll.push(callback);
|
|
81
|
-
break;
|
|
82
|
-
case 'afterAll':
|
|
83
|
-
successCallbacks.afterAll.push(callback);
|
|
84
|
-
break;
|
|
85
|
-
default:
|
|
86
|
-
successCallbacks.other.push(callback);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
effectApi.onError = (callback: EffectErrorCallback<Action>, position?: EffectSubscribePosition) => {
|
|
90
|
-
switch (position) {
|
|
91
|
-
case 'beforeAll':
|
|
92
|
-
errorCallbacks.beforeAll.push(callback);
|
|
93
|
-
break;
|
|
94
|
-
case 'afterAll':
|
|
95
|
-
errorCallbacks.afterAll.push(callback);
|
|
96
|
-
break;
|
|
97
|
-
default:
|
|
98
|
-
errorCallbacks.other.push(callback);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
effectApi.onFinally = (callback: EffectFinallyCallback<Action>, position?: EffectSubscribePosition) => {
|
|
102
|
-
switch (position) {
|
|
103
|
-
case 'beforeAll':
|
|
104
|
-
finallyCallbacks.beforeAll.push(callback);
|
|
105
|
-
break;
|
|
106
|
-
case 'afterAll':
|
|
107
|
-
finallyCallbacks.afterAll.push(callback);
|
|
108
|
-
break;
|
|
109
|
-
default:
|
|
110
|
-
finallyCallbacks.other.push(callback);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
return effectApi;
|
|
115
|
-
};
|
package/src/index.ts
DELETED
package/src/marker/index.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { EffectAction, Effect, EffectSubscribePosition } from '../effect';
|
|
2
|
-
import { StoreHandlerMap } from '../store';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export type MarkerListener = () => void;
|
|
6
|
-
|
|
7
|
-
export type Marker<State> = {
|
|
8
|
-
on: <Action extends EffectAction>(event: keyof StoreHandlerMap<State, Action>, effect: Effect<Action>, position?: EffectSubscribePosition) => Marker<State>;
|
|
9
|
-
subscribe: (listener: MarkerListener) => void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const marker = function <State> (position?: EffectSubscribePosition): Marker<State> {
|
|
13
|
-
const listeners: Array<MarkerListener> = [];
|
|
14
|
-
|
|
15
|
-
const markerApi: Marker<State> = {
|
|
16
|
-
on : (event, effect) => {
|
|
17
|
-
if (event === 'onBefore') {
|
|
18
|
-
effect.onBefore(() => listeners.forEach((listener) => listener()), position);
|
|
19
|
-
} else if (event === 'onSuccess') {
|
|
20
|
-
effect.onSuccess(() => listeners.forEach((listener) => listener()), position);
|
|
21
|
-
} else if (event === 'onError') {
|
|
22
|
-
effect.onError(() => listeners.forEach((listener) => listener()), position);
|
|
23
|
-
} else {
|
|
24
|
-
effect.onFinally(() => listeners.forEach((listener) => listener()), position);
|
|
25
|
-
}
|
|
26
|
-
return markerApi;
|
|
27
|
-
},
|
|
28
|
-
subscribe: (listener: MarkerListener) => {
|
|
29
|
-
listeners.push(listener);
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
return markerApi;
|
|
34
|
-
};
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { beforeAll, describe, expect, test, vi } from 'vitest';
|
|
2
|
-
import { marker } from './index';
|
|
3
|
-
import { effect } from '../effect';
|
|
4
|
-
import { store } from '../store';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const createPostAction = async (id: number) => {
|
|
8
|
-
return new Promise<{ id: number }>((resolve) => {
|
|
9
|
-
setTimeout(() => {
|
|
10
|
-
resolve({ id });
|
|
11
|
-
}, 500);
|
|
12
|
-
});
|
|
13
|
-
};
|
|
14
|
-
const loginAction = async () => {
|
|
15
|
-
};
|
|
16
|
-
const logoutAction = async () => {
|
|
17
|
-
};
|
|
18
|
-
const loginEffect = effect(loginAction);
|
|
19
|
-
const logoutEffect = effect(logoutAction);
|
|
20
|
-
const createPostEffect = effect(createPostAction);
|
|
21
|
-
const loginMarker = marker('beforeAll').on('onSuccess', loginEffect);
|
|
22
|
-
const logoutMarker = marker('afterAll').on('onSuccess', logoutEffect);
|
|
23
|
-
|
|
24
|
-
const postsStore = store<Array<{ id: number }>>([], true)
|
|
25
|
-
.enableOn(loginMarker)
|
|
26
|
-
.disableOn(logoutMarker)
|
|
27
|
-
.on(createPostEffect, 'onSuccess', (state, { result }) => state.concat(result));
|
|
28
|
-
|
|
29
|
-
describe('marker', () => {
|
|
30
|
-
beforeAll(() => {
|
|
31
|
-
postsStore.set([]);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
test('check with effect', async () => {
|
|
35
|
-
const mockFunction = vi.fn();
|
|
36
|
-
loginMarker.subscribe(mockFunction);
|
|
37
|
-
await loginEffect().finally(() => {
|
|
38
|
-
expect(mockFunction).toBeCalledTimes(1);
|
|
39
|
-
});
|
|
40
|
-
await loginEffect().finally(() => {
|
|
41
|
-
expect(mockFunction).toBeCalledTimes(2);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('check with effect + store', () => {
|
|
46
|
-
createPostEffect(1)
|
|
47
|
-
.finally(() => {
|
|
48
|
-
expect(postsStore.get()).deep.eq([]);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
loginEffect().finally(async () => {
|
|
52
|
-
await createPostEffect(2).finally(() => {
|
|
53
|
-
expect(postsStore.get()).deep.eq([ { id: 2 } ]);
|
|
54
|
-
});
|
|
55
|
-
createPostEffect(3)
|
|
56
|
-
.then(() => {
|
|
57
|
-
expect(postsStore.get()).deep.eq([ { id: 2 } ]);
|
|
58
|
-
});
|
|
59
|
-
logoutEffect();
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('check queue', () => {
|
|
64
|
-
const queue: Array<number> = [];
|
|
65
|
-
const logoutEffect = async function () {
|
|
66
|
-
return new Promise(resolve => setTimeout(resolve, 100));
|
|
67
|
-
};
|
|
68
|
-
const beforeLogout = effect(logoutEffect);
|
|
69
|
-
const middleLogout = effect(logoutEffect);
|
|
70
|
-
const afterLogout = effect(logoutEffect);
|
|
71
|
-
|
|
72
|
-
store<Array<number>>([]).on(middleLogout, 'onSuccess', (state) => {
|
|
73
|
-
queue.push(2);
|
|
74
|
-
return state;
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
marker('afterAll').on('onSuccess', afterLogout).subscribe(() => queue.push(3));
|
|
78
|
-
marker('beforeAll').on('onSuccess', beforeLogout).subscribe(() => queue.push(1));
|
|
79
|
-
|
|
80
|
-
logoutEffect()
|
|
81
|
-
.finally(() => {
|
|
82
|
-
expect(queue).deep.eq([ 1, 2, 3 ]);
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
});
|
package/src/pending/index.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { store } from '../store';
|
|
2
|
-
import { to } from '../to';
|
|
3
|
-
import { Effect } from '../effect';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export const pending = function (effects: Array<Effect<any>>) {
|
|
7
|
-
const _store = store<boolean>(false);
|
|
8
|
-
effects.forEach((effect) => {
|
|
9
|
-
_store.on(effect, 'onBefore', to(true));
|
|
10
|
-
_store.on(effect, 'onFinally', to(false));
|
|
11
|
-
});
|
|
12
|
-
return _store;
|
|
13
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import { effect } from '../effect';
|
|
3
|
-
import { pending } from './index';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
describe('pending', () => {
|
|
7
|
-
test('valid', async () => {
|
|
8
|
-
const getPostsAction = async function () {
|
|
9
|
-
return new Promise<void>((resolve) => setTimeout(resolve, 200));
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const getPostsEffect = effect(getPostsAction);
|
|
13
|
-
|
|
14
|
-
const postsPending = pending([ getPostsEffect ]);
|
|
15
|
-
|
|
16
|
-
expect(postsPending.get()).equal(false);
|
|
17
|
-
|
|
18
|
-
getPostsEffect();
|
|
19
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
20
|
-
expect(postsPending.get()).equal(true);
|
|
21
|
-
await new Promise(resolve => setTimeout(resolve, 150));
|
|
22
|
-
expect(postsPending.get()).equal(false);
|
|
23
|
-
});
|
|
24
|
-
});
|
package/src/store/index.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { EffectAction, Effect, effect } from '../effect';
|
|
2
|
-
import { Marker } from '../marker';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export type StoreOnBeforeHandler<State, Action extends EffectAction> = (state: State, data: {
|
|
6
|
-
args: Parameters<Action>
|
|
7
|
-
}) => State;
|
|
8
|
-
export type StoreOnSuccessHandler<State, Action extends EffectAction> = (state: State, data: {
|
|
9
|
-
args: Parameters<Action>
|
|
10
|
-
result: Awaited<ReturnType<Action>>;
|
|
11
|
-
}) => State;
|
|
12
|
-
export type StoreOnErrorHandler<State, Action extends EffectAction> = (state: State, data: {
|
|
13
|
-
args: Parameters<Action>
|
|
14
|
-
error: unknown;
|
|
15
|
-
}) => State;
|
|
16
|
-
export type StoreOnFinallyHandler<State, Action extends EffectAction> = (state: State, data: {
|
|
17
|
-
args: Parameters<Action>
|
|
18
|
-
}) => State;
|
|
19
|
-
|
|
20
|
-
export type StoreHandlerMap<State, Action extends EffectAction> = {
|
|
21
|
-
onBefore: StoreOnBeforeHandler<State, Action>;
|
|
22
|
-
onSuccess: StoreOnSuccessHandler<State, Action>;
|
|
23
|
-
onError: StoreOnErrorHandler<State, Action>;
|
|
24
|
-
onFinally: StoreOnFinallyHandler<State, Action>;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export type StoreEffectSubscribe<State> =
|
|
28
|
-
<
|
|
29
|
-
Action extends EffectAction,
|
|
30
|
-
Event extends keyof StoreHandlerMap<State, Action>
|
|
31
|
-
> (
|
|
32
|
-
effect: Effect<Action>,
|
|
33
|
-
event: Event,
|
|
34
|
-
handler: StoreHandlerMap<State, Action>[Event],
|
|
35
|
-
) => Store<State>;
|
|
36
|
-
|
|
37
|
-
export type StoreListener<State> = (state: State) => void;
|
|
38
|
-
export type StoreMarkerSubscribe<State> = (marker: Marker<State>) => Store<State>;
|
|
39
|
-
|
|
40
|
-
export type Store<State> = {
|
|
41
|
-
on: StoreEffectSubscribe<State>;
|
|
42
|
-
enableOn: StoreMarkerSubscribe<State>;
|
|
43
|
-
disableOn: StoreMarkerSubscribe<State>;
|
|
44
|
-
get: () => State;
|
|
45
|
-
set: (data: State) => void;
|
|
46
|
-
subscribe: (listener: StoreListener<State>) => () => void;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export const enableCheck = function (enabled: boolean, callback: () => void) {
|
|
50
|
-
if (enabled) {
|
|
51
|
-
callback();
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
export const store = function <State extends any> (state: State, enabled: boolean = true): Store<State> {
|
|
56
|
-
const listeners: Array<StoreListener<State>> = [];
|
|
57
|
-
|
|
58
|
-
const storeApi: Store<State> = {
|
|
59
|
-
on: <
|
|
60
|
-
Action extends EffectAction,
|
|
61
|
-
Event extends keyof StoreHandlerMap<State, Action>
|
|
62
|
-
> (effect: Effect<Action>, event: Event, handler: StoreHandlerMap<State, Action>[Event]) => {
|
|
63
|
-
if (event === 'onBefore') {
|
|
64
|
-
effect.onBefore((...args) =>
|
|
65
|
-
enableCheck(
|
|
66
|
-
enabled,
|
|
67
|
-
() => storeApi.set(
|
|
68
|
-
(handler as StoreOnBeforeHandler<State, Action>)(state, { args }),
|
|
69
|
-
),
|
|
70
|
-
),
|
|
71
|
-
);
|
|
72
|
-
} else if (event === 'onSuccess') {
|
|
73
|
-
effect.onSuccess((result, ...args) =>
|
|
74
|
-
enableCheck(
|
|
75
|
-
enabled,
|
|
76
|
-
() => storeApi.set(
|
|
77
|
-
(handler as StoreOnSuccessHandler<State, Action>)(state, {
|
|
78
|
-
result, args,
|
|
79
|
-
}),
|
|
80
|
-
),
|
|
81
|
-
),
|
|
82
|
-
);
|
|
83
|
-
} else if (event === 'onError') {
|
|
84
|
-
effect.onError((error, ...args) =>
|
|
85
|
-
enableCheck(
|
|
86
|
-
enabled,
|
|
87
|
-
() => storeApi.set(
|
|
88
|
-
(handler as StoreOnErrorHandler<State, Action>)(state, {
|
|
89
|
-
error, args,
|
|
90
|
-
}),
|
|
91
|
-
),
|
|
92
|
-
),
|
|
93
|
-
);
|
|
94
|
-
} else {
|
|
95
|
-
effect.onFinally((...args) =>
|
|
96
|
-
enableCheck(
|
|
97
|
-
enabled,
|
|
98
|
-
() => storeApi.set(
|
|
99
|
-
(handler as StoreOnFinallyHandler<State, Action>)(state, { args }),
|
|
100
|
-
),
|
|
101
|
-
),
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return storeApi;
|
|
106
|
-
},
|
|
107
|
-
get (): State {
|
|
108
|
-
return state;
|
|
109
|
-
},
|
|
110
|
-
set (value: State) {
|
|
111
|
-
state = value;
|
|
112
|
-
listeners.forEach((listener) => listener(state));
|
|
113
|
-
},
|
|
114
|
-
subscribe (listener: StoreListener<State>) {
|
|
115
|
-
listeners.push(listener);
|
|
116
|
-
return () => {
|
|
117
|
-
const index = listeners.indexOf(listener);
|
|
118
|
-
if (~index) {
|
|
119
|
-
listeners.splice(index, 1);
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
},
|
|
123
|
-
enableOn (marker: Marker<State>) {
|
|
124
|
-
marker.subscribe(() => enabled = true);
|
|
125
|
-
return storeApi;
|
|
126
|
-
},
|
|
127
|
-
disableOn (marker: Marker<State>) {
|
|
128
|
-
marker.subscribe(() => enabled = false);
|
|
129
|
-
return storeApi;
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
return storeApi;
|
|
134
|
-
};
|
package/src/to/index.ts
DELETED
package/src/to/to.test.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'vitest';
|
|
2
|
-
import { to } from './index';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
describe('to', () => {
|
|
6
|
-
test('valid', () => {
|
|
7
|
-
const arr: Array<number> = [];
|
|
8
|
-
const obj = {};
|
|
9
|
-
|
|
10
|
-
expect(to(1)()).equal(1);
|
|
11
|
-
expect(to(arr)()).equal(arr);
|
|
12
|
-
expect(to(obj)()).equal(obj);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
test('invalid', () => {
|
|
16
|
-
const arr: Array<number> = [];
|
|
17
|
-
const obj = {};
|
|
18
|
-
|
|
19
|
-
expect(to(1)()).not.equal(2);
|
|
20
|
-
expect(to(arr)()).not.equal(obj);
|
|
21
|
-
expect(to(obj)()).not.equal(arr);
|
|
22
|
-
});
|
|
23
|
-
});
|
package/tsconfig.json
DELETED
package/vite.config.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vitest/config';
|
|
2
|
-
import dtsPlugin from 'vite-plugin-dts';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export default defineConfig({
|
|
6
|
-
plugins: [
|
|
7
|
-
dtsPlugin({
|
|
8
|
-
outDir : 'dist',
|
|
9
|
-
entryRoot : 'src',
|
|
10
|
-
rollupTypes: true,
|
|
11
|
-
}),
|
|
12
|
-
],
|
|
13
|
-
build : {
|
|
14
|
-
outDir : './dist',
|
|
15
|
-
target : 'esnext',
|
|
16
|
-
emptyOutDir: true,
|
|
17
|
-
lib : {
|
|
18
|
-
entry : './src/index.ts',
|
|
19
|
-
fileName: 'index',
|
|
20
|
-
formats : [ 'es', 'cjs' ],
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
});
|