@mic-rexjs/usecases-react 3.3.0 → 3.6.2
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/dist/index.min.js +1 -1
- package/dist/index.min.js.LICENSE.txt +0 -2
- package/es/components/RenderingEventTrigger/index.d.ts +2 -0
- package/es/components/RenderingEventTrigger/index.js +7 -0
- package/es/components/RenderingEventTrigger/types.d.ts +3 -0
- package/es/hooks/useContextualItem/index.js +2 -3
- package/es/hooks/useDepsKey/index.js +19 -9
- package/es/hooks/useEntity/index.d.ts +1 -4
- package/es/hooks/useEntity/index.js +59 -50
- package/es/hooks/useEntityInitializing/index.d.ts +2 -0
- package/es/hooks/useEntityInitializing/index.js +16 -0
- package/es/hooks/useExec/index.d.ts +2 -1
- package/es/hooks/useExec/index.js +3 -3
- package/es/hooks/useExec/types.d.ts +3 -0
- package/es/hooks/useProvider/index.d.ts +1 -1
- package/es/hooks/useProvider/index.js +5 -2
- package/es/hooks/useReducers/index.js +8 -6
- package/es/hooks/useStore/index.d.ts +1 -2
- package/es/hooks/useStore/index.js +55 -69
- package/es/hooks/useUseCase/index.js +5 -6
- package/es/hooks/useUseCase/index.test.js +92 -35
- package/es/index.d.ts +2 -2
- package/es/index.js +1 -1
- package/es/methods/runEntityInitializer/index.d.ts +3 -0
- package/es/methods/runEntityInitializer/index.js +67 -0
- package/es/methods/triggerWatchers/index.js +3 -3
- package/es/usecases/lifecycleEventUseCase/index.d.ts +3 -0
- package/es/usecases/lifecycleEventUseCase/index.js +34 -0
- package/es/usecases/lifecycleEventUseCase/types.d.ts +36 -0
- package/es/usecases/lifecycleEventUseCase/types.js +1 -0
- package/es/usecases/lifecycleUseCase/index.d.ts +2 -0
- package/es/usecases/lifecycleUseCase/index.js +21 -0
- package/es/usecases/lifecycleUseCase/types.d.ts +5 -0
- package/es/usecases/lifecycleUseCase/types.js +1 -0
- package/es/usecases/methodUseCase/index.js +4 -4
- package/es/usecases/objectUtilsUseCase/index.d.ts +2 -0
- package/es/usecases/objectUtilsUseCase/index.js +131 -0
- package/es/usecases/objectUtilsUseCase/types.d.ts +14 -0
- package/es/usecases/objectUtilsUseCase/types.js +1 -0
- package/lib/components/RenderingEventTrigger/index.js +13 -0
- package/lib/hooks/useContextualItem/index.js +3 -4
- package/lib/hooks/useDepsKey/index.js +19 -10
- package/lib/hooks/useEntity/index.js +59 -50
- package/lib/hooks/useEntityInitializing/index.js +22 -0
- package/lib/hooks/useExec/index.js +3 -3
- package/lib/hooks/useProvider/index.js +5 -2
- package/lib/hooks/useReducers/index.js +9 -7
- package/lib/hooks/useStore/index.js +54 -67
- package/lib/hooks/useUseCase/index.js +6 -7
- package/lib/hooks/useUseCase/index.test.js +86 -35
- package/lib/index.js +3 -3
- package/lib/methods/runEntityInitializer/index.js +73 -0
- package/lib/methods/triggerWatchers/index.js +3 -3
- package/lib/usecases/lifecycleEventUseCase/index.js +40 -0
- package/lib/usecases/lifecycleEventUseCase/types.js +5 -0
- package/lib/usecases/{lifeCycleUseCase → lifecycleUseCase}/index.js +14 -12
- package/lib/usecases/lifecycleUseCase/types.js +5 -0
- package/lib/usecases/methodUseCase/index.js +4 -4
- package/lib/usecases/objectUtilsUseCase/index.js +140 -0
- package/lib/usecases/objectUtilsUseCase/types.js +5 -0
- package/package.json +3 -3
- package/es/usecases/lifeCycleUseCase/index.d.ts +0 -2
- package/es/usecases/lifeCycleUseCase/index.js +0 -18
- package/es/usecases/lifeCycleUseCase/types.d.ts +0 -9
- package/es/usecases/valueUseCase/index.d.ts +0 -2
- package/es/usecases/valueUseCase/index.js +0 -168
- package/es/usecases/valueUseCase/types.d.ts +0 -21
- package/lib/usecases/valueUseCase/index.js +0 -219
- /package/es/{usecases/lifeCycleUseCase → components/RenderingEventTrigger}/types.js +0 -0
- /package/es/{usecases/valueUseCase → hooks/useExec}/types.js +0 -0
- /package/lib/{usecases/lifeCycleUseCase → components/RenderingEventTrigger}/types.js +0 -0
- /package/lib/{usecases/valueUseCase → hooks/useExec}/types.js +0 -0
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
2
|
import { useArgumentTypes } from '../useArgumentTypes';
|
|
3
3
|
import { useConstantFn } from '../useConstantFn';
|
|
4
|
-
import { useConstantReducers } from '../useConstantReducers';
|
|
5
4
|
import { useContext } from '../useContext';
|
|
6
5
|
import { useEntity } from '../useEntity';
|
|
7
6
|
import { useFullArguments } from '../useFullArguments';
|
|
@@ -25,20 +24,20 @@ export const useUseCase = function () {
|
|
|
25
24
|
unsafeUsecase = _fullArguments[1],
|
|
26
25
|
options = _fullArguments[2],
|
|
27
26
|
deps = _fullArguments[3];
|
|
28
|
-
const _useConstantReducers = useConstantReducers(methodUseCase),
|
|
29
|
-
cacheCalls = _useConstantReducers.cacheCalls;
|
|
30
27
|
const usecase = useConstantFn(unsafeUsecase);
|
|
31
28
|
const context = useContext(usecase, argumentTypes);
|
|
32
29
|
const entityContext = context;
|
|
33
30
|
const statuses = useStatuses(context, argumentTypes);
|
|
34
|
-
const store = useStore(unsafeEntity, entityContext, statuses,
|
|
31
|
+
const store = useStore(unsafeEntity, entityContext, statuses, deps);
|
|
35
32
|
const reducers = useReducers(usecase, context, store, statuses, options, deps);
|
|
36
|
-
const entity = useEntity(
|
|
33
|
+
const entity = useEntity(store, statuses, options);
|
|
37
34
|
const Provider = useProvider(statuses, context, store, reducers);
|
|
38
35
|
return useCreation(() => {
|
|
39
36
|
if ((statuses & Statuses.EntityEnabled) !== Statuses.EntityEnabled) {
|
|
40
37
|
return reducers;
|
|
41
38
|
}
|
|
39
|
+
const _methodUseCase = methodUseCase(),
|
|
40
|
+
cacheCalls = _methodUseCase.cacheCalls;
|
|
42
41
|
const cachedReducers = cacheCalls(reducers, {
|
|
43
42
|
onShouldCache() {
|
|
44
43
|
return isRenderingRef.current;
|
|
@@ -53,5 +52,5 @@ export const useUseCase = function () {
|
|
|
53
52
|
...entity
|
|
54
53
|
} : entity;
|
|
55
54
|
return [newEntity, cachedReducers, Provider];
|
|
56
|
-
}, [statuses, entity, reducers, Provider, isRenderingRef
|
|
55
|
+
}, [statuses, entity, reducers, Provider, isRenderingRef]);
|
|
57
56
|
};
|
|
@@ -9,6 +9,7 @@ import { act, render, renderHook } from '@testing-library/react';
|
|
|
9
9
|
import { useDeepCompareEffect, useMemoizedFn, useMount, useUpdate, useUpdateEffect } from 'ahooks';
|
|
10
10
|
import { Fragment, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
11
|
import { createPortal } from 'react-dom';
|
|
12
|
+
import { lifecycleUseCase } from '../../usecases/lifecycleUseCase';
|
|
12
13
|
const EXT_1 = '.png';
|
|
13
14
|
const EXT_2 = '.jpg';
|
|
14
15
|
const PATH_1 = `hello${EXT_1}`;
|
|
@@ -1998,15 +1999,16 @@ describe('useUseCase', () => {
|
|
|
1998
1999
|
expect(onStringMount).toHaveBeenCalledWith('hello');
|
|
1999
2000
|
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
2000
2001
|
});
|
|
2001
|
-
test('`
|
|
2002
|
-
const
|
|
2002
|
+
test('`onBind` event should be called when component mount', () => {
|
|
2003
|
+
const onBind = jest.fn(entity => {
|
|
2003
2004
|
void entity;
|
|
2004
2005
|
});
|
|
2005
2006
|
const testUseCase = () => {
|
|
2006
|
-
const
|
|
2007
|
+
const lifecycleReducers = lifecycleUseCase({
|
|
2008
|
+
onBind
|
|
2009
|
+
});
|
|
2007
2010
|
return {
|
|
2008
|
-
...
|
|
2009
|
-
bindEntity
|
|
2011
|
+
...lifecycleReducers
|
|
2010
2012
|
};
|
|
2011
2013
|
};
|
|
2012
2014
|
renderHook(() => {
|
|
@@ -2017,21 +2019,76 @@ describe('useUseCase', () => {
|
|
|
2017
2019
|
setEntity(100);
|
|
2018
2020
|
});
|
|
2019
2021
|
});
|
|
2020
|
-
expect(
|
|
2021
|
-
expect(
|
|
2022
|
+
expect(onBind).toHaveBeenCalledTimes(1);
|
|
2023
|
+
expect(onBind).toHaveBeenCalledWith(5);
|
|
2022
2024
|
});
|
|
2023
|
-
test('`
|
|
2024
|
-
const
|
|
2025
|
-
void
|
|
2025
|
+
test('`onChange` event should be called when entity change', () => {
|
|
2026
|
+
const onChange = jest.fn((newEntity, oldEntity) => {
|
|
2027
|
+
void newEntity;
|
|
2028
|
+
void oldEntity;
|
|
2026
2029
|
});
|
|
2027
2030
|
const testUseCase = () => {
|
|
2028
|
-
const
|
|
2031
|
+
const lifecycleReducers = lifecycleUseCase({
|
|
2032
|
+
onChange
|
|
2033
|
+
});
|
|
2029
2034
|
return {
|
|
2030
|
-
...
|
|
2031
|
-
unbindEntity
|
|
2035
|
+
...lifecycleReducers
|
|
2032
2036
|
};
|
|
2033
2037
|
};
|
|
2034
2038
|
const _renderHook37 = renderHook(() => {
|
|
2039
|
+
return useUseCase(5, testUseCase);
|
|
2040
|
+
}),
|
|
2041
|
+
result = _renderHook37.result;
|
|
2042
|
+
const current = result.current;
|
|
2043
|
+
const _current8 = _slicedToArray(current, 2),
|
|
2044
|
+
setEntity = _current8[1].setEntity;
|
|
2045
|
+
expect(onChange).toHaveBeenCalledTimes(0);
|
|
2046
|
+
act(() => {
|
|
2047
|
+
setEntity(100);
|
|
2048
|
+
});
|
|
2049
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
2050
|
+
expect(onChange).toHaveBeenCalledWith(100, 5);
|
|
2051
|
+
});
|
|
2052
|
+
test('`onUpdate` event should be called when entity change', () => {
|
|
2053
|
+
const onUpdate = jest.fn((newEntity, oldEntity) => {
|
|
2054
|
+
void newEntity;
|
|
2055
|
+
void oldEntity;
|
|
2056
|
+
});
|
|
2057
|
+
const testUseCase = () => {
|
|
2058
|
+
const lifecycleReducers = lifecycleUseCase({
|
|
2059
|
+
onUpdate
|
|
2060
|
+
});
|
|
2061
|
+
return {
|
|
2062
|
+
...lifecycleReducers
|
|
2063
|
+
};
|
|
2064
|
+
};
|
|
2065
|
+
const _renderHook38 = renderHook(() => {
|
|
2066
|
+
return useUseCase(5, testUseCase);
|
|
2067
|
+
}),
|
|
2068
|
+
result = _renderHook38.result;
|
|
2069
|
+
const current = result.current;
|
|
2070
|
+
const _current9 = _slicedToArray(current, 2),
|
|
2071
|
+
setEntity = _current9[1].setEntity;
|
|
2072
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2073
|
+
act(() => {
|
|
2074
|
+
setEntity(100);
|
|
2075
|
+
});
|
|
2076
|
+
expect(onUpdate).toHaveBeenCalledTimes(1);
|
|
2077
|
+
expect(onUpdate).toHaveBeenCalledWith(100, 5);
|
|
2078
|
+
});
|
|
2079
|
+
test('`onUnbind` event should be called when component unmount', () => {
|
|
2080
|
+
const onUnbind = jest.fn(entity => {
|
|
2081
|
+
void entity;
|
|
2082
|
+
});
|
|
2083
|
+
const testUseCase = () => {
|
|
2084
|
+
const lifecycleReducers = lifecycleUseCase({
|
|
2085
|
+
onUnbind
|
|
2086
|
+
});
|
|
2087
|
+
return {
|
|
2088
|
+
...lifecycleReducers
|
|
2089
|
+
};
|
|
2090
|
+
};
|
|
2091
|
+
const _renderHook39 = renderHook(() => {
|
|
2035
2092
|
const _useUseCase26 = useUseCase(5, testUseCase),
|
|
2036
2093
|
_useUseCase27 = _slicedToArray(_useUseCase26, 2),
|
|
2037
2094
|
setEntity = _useUseCase27[1].setEntity;
|
|
@@ -2039,11 +2096,11 @@ describe('useUseCase', () => {
|
|
|
2039
2096
|
setEntity(100);
|
|
2040
2097
|
});
|
|
2041
2098
|
}),
|
|
2042
|
-
unmount =
|
|
2043
|
-
expect(
|
|
2099
|
+
unmount = _renderHook39.unmount;
|
|
2100
|
+
expect(onUnbind).toHaveBeenCalledTimes(0);
|
|
2044
2101
|
unmount();
|
|
2045
|
-
expect(
|
|
2046
|
-
expect(
|
|
2102
|
+
expect(onUnbind).toHaveBeenCalledTimes(1);
|
|
2103
|
+
expect(onUnbind).toHaveBeenCalledWith(100);
|
|
2047
2104
|
});
|
|
2048
2105
|
});
|
|
2049
2106
|
describe('`useUseCase` should work the same as `useContextualCoreCollection`', () => {
|
|
@@ -2606,38 +2663,38 @@ describe('useUseCase', () => {
|
|
|
2606
2663
|
});
|
|
2607
2664
|
describe('`useUseCase` should work the same as `useReducers`', () => {
|
|
2608
2665
|
test('`entity` should equal `defaultFile`', () => {
|
|
2609
|
-
const
|
|
2666
|
+
const _renderHook40 = renderHook(() => {
|
|
2610
2667
|
return useUseCase(mathUseCase);
|
|
2611
2668
|
}),
|
|
2612
|
-
result =
|
|
2669
|
+
result = _renderHook40.result;
|
|
2613
2670
|
const reducers = result.current;
|
|
2614
2671
|
expect(Array.isArray(reducers)).toBe(false);
|
|
2615
2672
|
});
|
|
2616
2673
|
test('returned reducer should work', () => {
|
|
2617
|
-
const
|
|
2674
|
+
const _renderHook41 = renderHook(() => {
|
|
2618
2675
|
return useUseCase(mathUseCase);
|
|
2619
2676
|
}),
|
|
2620
|
-
result =
|
|
2677
|
+
result = _renderHook41.result;
|
|
2621
2678
|
const reducers = result.current;
|
|
2622
2679
|
const add = reducers.add;
|
|
2623
2680
|
expect(add(1, 2)).toBe(3);
|
|
2624
2681
|
});
|
|
2625
2682
|
test('`usecase` should be called only once if deps has not provided', () => {
|
|
2626
2683
|
const mockUseCase = jest.fn(mathUseCase);
|
|
2627
|
-
const
|
|
2684
|
+
const _renderHook42 = renderHook(() => {
|
|
2628
2685
|
return useUseCase(mockUseCase);
|
|
2629
2686
|
}),
|
|
2630
|
-
rerender =
|
|
2687
|
+
rerender = _renderHook42.rerender;
|
|
2631
2688
|
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2632
2689
|
rerender();
|
|
2633
2690
|
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2634
2691
|
});
|
|
2635
2692
|
test('`usecase` should be called only once if deps has not changed', () => {
|
|
2636
2693
|
const mockUseCase = jest.fn(mathUseCase);
|
|
2637
|
-
const
|
|
2694
|
+
const _renderHook43 = renderHook(() => {
|
|
2638
2695
|
return useUseCase(mockUseCase, {}, [1, 'x']);
|
|
2639
2696
|
}),
|
|
2640
|
-
rerender =
|
|
2697
|
+
rerender = _renderHook43.rerender;
|
|
2641
2698
|
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2642
2699
|
rerender();
|
|
2643
2700
|
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
@@ -2645,10 +2702,10 @@ describe('useUseCase', () => {
|
|
|
2645
2702
|
test('`usecase` should be called if deps has changed', () => {
|
|
2646
2703
|
let i = 0;
|
|
2647
2704
|
const mockUseCase = jest.fn(mathUseCase);
|
|
2648
|
-
const
|
|
2705
|
+
const _renderHook44 = renderHook(() => {
|
|
2649
2706
|
return useUseCase(mockUseCase, {}, [i++, 'x']);
|
|
2650
2707
|
}),
|
|
2651
|
-
rerender =
|
|
2708
|
+
rerender = _renderHook44.rerender;
|
|
2652
2709
|
expect(mockUseCase).toHaveBeenCalledTimes(1);
|
|
2653
2710
|
rerender();
|
|
2654
2711
|
expect(mockUseCase).toHaveBeenCalledTimes(2);
|
|
@@ -2732,12 +2789,12 @@ describe('useUseCase', () => {
|
|
|
2732
2789
|
expect(subtractionReducer).toHaveReturnedWith(4);
|
|
2733
2790
|
});
|
|
2734
2791
|
test('`options.extraValue` should be added after call `add` method', () => {
|
|
2735
|
-
const
|
|
2792
|
+
const _renderHook45 = renderHook(() => {
|
|
2736
2793
|
return useUseCase(mathUseCase, {
|
|
2737
2794
|
extraValue: 5
|
|
2738
2795
|
});
|
|
2739
2796
|
}),
|
|
2740
|
-
result =
|
|
2797
|
+
result = _renderHook45.result;
|
|
2741
2798
|
const reducers = result.current;
|
|
2742
2799
|
const add = reducers.add;
|
|
2743
2800
|
expect(add(1, 2)).toBe(8);
|
|
@@ -2745,7 +2802,7 @@ describe('useUseCase', () => {
|
|
|
2745
2802
|
test('when `options` has changed, it should not trigger update', () => {
|
|
2746
2803
|
const onUpdate = jest.fn();
|
|
2747
2804
|
const onDeepUpdate = jest.fn();
|
|
2748
|
-
const
|
|
2805
|
+
const _renderHook46 = renderHook(() => {
|
|
2749
2806
|
const _useState7 = useState(0),
|
|
2750
2807
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
2751
2808
|
extraValue = _useState8[0],
|
|
@@ -2761,7 +2818,7 @@ describe('useUseCase', () => {
|
|
|
2761
2818
|
}, [reducers]);
|
|
2762
2819
|
return setExtraValue;
|
|
2763
2820
|
}),
|
|
2764
|
-
result =
|
|
2821
|
+
result = _renderHook46.result;
|
|
2765
2822
|
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2766
2823
|
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2767
2824
|
act(() => {
|
|
@@ -2773,7 +2830,7 @@ describe('useUseCase', () => {
|
|
|
2773
2830
|
test('when `deps` change, it should update reducers', () => {
|
|
2774
2831
|
const onUpdate = jest.fn();
|
|
2775
2832
|
const onDeepUpdate = jest.fn();
|
|
2776
|
-
const
|
|
2833
|
+
const _renderHook47 = renderHook(() => {
|
|
2777
2834
|
const _useState9 = useState(0),
|
|
2778
2835
|
_useState0 = _slicedToArray(_useState9, 2),
|
|
2779
2836
|
extraValue = _useState0[0],
|
|
@@ -2789,7 +2846,7 @@ describe('useUseCase', () => {
|
|
|
2789
2846
|
}, [reducers]);
|
|
2790
2847
|
return setExtraValue;
|
|
2791
2848
|
}),
|
|
2792
|
-
result =
|
|
2849
|
+
result = _renderHook47.result;
|
|
2793
2850
|
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2794
2851
|
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2795
2852
|
act(() => {
|
|
@@ -2801,7 +2858,7 @@ describe('useUseCase', () => {
|
|
|
2801
2858
|
test('empty `deps` should not update reducers', () => {
|
|
2802
2859
|
const onUpdate = jest.fn();
|
|
2803
2860
|
const onDeepUpdate = jest.fn();
|
|
2804
|
-
const
|
|
2861
|
+
const _renderHook48 = renderHook(() => {
|
|
2805
2862
|
const _useState1 = useState(0),
|
|
2806
2863
|
_useState10 = _slicedToArray(_useState1, 2),
|
|
2807
2864
|
extraValue = _useState10[0],
|
|
@@ -2817,7 +2874,7 @@ describe('useUseCase', () => {
|
|
|
2817
2874
|
}, [reducers]);
|
|
2818
2875
|
return setExtraValue;
|
|
2819
2876
|
}),
|
|
2820
|
-
result =
|
|
2877
|
+
result = _renderHook48.result;
|
|
2821
2878
|
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
2822
2879
|
expect(onDeepUpdate).toHaveBeenCalledTimes(0);
|
|
2823
2880
|
act(() => {
|
package/es/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export { UseCaseFragment } from './components/UseCaseFragment';
|
|
2
2
|
export { useUseCase } from './hooks/useUseCase';
|
|
3
|
-
export {
|
|
3
|
+
export { lifecycleUseCase } from './usecases/lifecycleUseCase';
|
|
4
4
|
export { useProviders } from './hooks/useProviders';
|
|
5
5
|
export type { EntityWatchEvent, RootCoreCollection, ContextualCoreCollection, CoreCollection, } from './hooks/useUseCase/types';
|
|
6
6
|
export type { UseCaseHookOptions } from './hooks/useUseCase/types';
|
|
7
7
|
export type { UseCaseProvider } from './hooks/useProvider/types';
|
|
8
|
-
export type {
|
|
8
|
+
export type { LifecycleReducers, LifecycleUseCaseOptions } from './usecases/lifecycleUseCase/types';
|
|
9
9
|
export type { UseCaseFragmentProps } from './components/UseCaseFragment/types';
|
package/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { UseCaseFragment } from './components/UseCaseFragment';
|
|
2
2
|
export { useUseCase } from './hooks/useUseCase';
|
|
3
|
-
export {
|
|
3
|
+
export { lifecycleUseCase } from './usecases/lifecycleUseCase';
|
|
4
4
|
export { useProviders } from './hooks/useProviders';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { EntityStore } from '@mic-rexjs/usecases';
|
|
2
|
+
import { EntityInitializer } from '../../types';
|
|
3
|
+
export declare const runEntityInitializer: <T>(store: EntityStore<T>, initializer: EntityInitializer<T>, prevCreateEntityList: Partial<T>[], isInitializing: boolean) => Partial<T>[];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createEntity, createEntityReducers } from '@mic-rexjs/usecases';
|
|
2
|
+
import { entityRuntimeUseCase } from '../../usecases/entityRuntimeUseCase';
|
|
3
|
+
import { objectUtilsUseCase } from '../../usecases/objectUtilsUseCase';
|
|
4
|
+
export const runEntityInitializer = (store, initializer, prevCreateEntityList, isInitializing) => {
|
|
5
|
+
let isAsync = false;
|
|
6
|
+
let index = 0;
|
|
7
|
+
const createEntityList = [];
|
|
8
|
+
const _objectUtilsUseCase = objectUtilsUseCase(),
|
|
9
|
+
isObject = _objectUtilsUseCase.isObject,
|
|
10
|
+
isEqual = _objectUtilsUseCase.isEqual;
|
|
11
|
+
const onInitStoreValue = value => {
|
|
12
|
+
if (!isInitializing || isAsync) {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
return store.initValue(value);
|
|
16
|
+
};
|
|
17
|
+
const _createEntityReducers = createEntityReducers(store, entityRuntimeUseCase, {
|
|
18
|
+
onInit(currentValue) {
|
|
19
|
+
return initializer(currentValue);
|
|
20
|
+
},
|
|
21
|
+
onCreate(newEntity, oldEntity) {
|
|
22
|
+
const currentIndex = index;
|
|
23
|
+
const isObj = isObject(oldEntity);
|
|
24
|
+
const isArray = isObj && Array.isArray(oldEntity);
|
|
25
|
+
index++;
|
|
26
|
+
createEntityList[currentIndex] = newEntity;
|
|
27
|
+
if (!isObj || isArray) {
|
|
28
|
+
return createEntity(oldEntity, newEntity);
|
|
29
|
+
}
|
|
30
|
+
const descriptors = {};
|
|
31
|
+
const prevEntity = prevCreateEntityList[currentIndex];
|
|
32
|
+
isEqual(prevEntity, newEntity, key => {
|
|
33
|
+
const descriptor = Object.getOwnPropertyDescriptor(newEntity, key) || null;
|
|
34
|
+
if (descriptor === null) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
descriptors[key] = descriptor;
|
|
38
|
+
});
|
|
39
|
+
return createEntity(oldEntity, Object.defineProperties({}, descriptors));
|
|
40
|
+
},
|
|
41
|
+
onGenerate(entity, result) {
|
|
42
|
+
if (typeof result === 'undefined') {
|
|
43
|
+
return [entity, result];
|
|
44
|
+
}
|
|
45
|
+
const newResult = createEntity(entity, result);
|
|
46
|
+
// 不能用 `store.value`,因为可能存在异步,异步更新是需要触发组件更新的
|
|
47
|
+
store.setValue(newResult);
|
|
48
|
+
return [newResult, result];
|
|
49
|
+
},
|
|
50
|
+
onYield(entity) {
|
|
51
|
+
return onInitStoreValue(entity);
|
|
52
|
+
},
|
|
53
|
+
onReturn(entity) {
|
|
54
|
+
const newEntity = onInitStoreValue(entity);
|
|
55
|
+
// 不能用 `store.value`,因为可能存在异步,异步更新是需要触发组件更新的
|
|
56
|
+
store.setValue(newEntity);
|
|
57
|
+
return newEntity;
|
|
58
|
+
}
|
|
59
|
+
}),
|
|
60
|
+
initEntity = _createEntityReducers.initEntity;
|
|
61
|
+
// 禁用 `store` 的事件,避免触发 `onChange`
|
|
62
|
+
store.disableWatchers();
|
|
63
|
+
initEntity();
|
|
64
|
+
store.enableWatchers();
|
|
65
|
+
isAsync = true;
|
|
66
|
+
return createEntityList;
|
|
67
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
import {
|
|
2
|
+
import { objectUtilsUseCase } from '../../usecases/objectUtilsUseCase';
|
|
3
3
|
export const triggerWatchers = (watch, newEntity, oldEntity) => {
|
|
4
|
-
const
|
|
5
|
-
matchProperty =
|
|
4
|
+
const _objectUtilsUseCase = objectUtilsUseCase(),
|
|
5
|
+
matchProperty = _objectUtilsUseCase.matchProperty;
|
|
6
6
|
for (const _ref of Object.entries(watch)) {
|
|
7
7
|
var _ref2 = _slicedToArray(_ref, 2);
|
|
8
8
|
const fieldPath = _ref2[0];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createUseCase } from '@mic-rexjs/usecases';
|
|
2
|
+
export const lifecycleEventUseCase = createUseCase(() => {
|
|
3
|
+
const map = new Map();
|
|
4
|
+
let events = null;
|
|
5
|
+
/**
|
|
6
|
+
* 逻辑是:先存,再绑定 `key`,再通过 `key` 获取,最后清除
|
|
7
|
+
*/
|
|
8
|
+
return () => {
|
|
9
|
+
const deleteLifecycleEvents = key => {
|
|
10
|
+
return map.delete(key);
|
|
11
|
+
};
|
|
12
|
+
const bindLifecycleEventsKey = key => {
|
|
13
|
+
if (events === null) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
const currentEvents = events;
|
|
17
|
+
events = null;
|
|
18
|
+
map.set(key, currentEvents);
|
|
19
|
+
return currentEvents;
|
|
20
|
+
};
|
|
21
|
+
const getLifecycleEvents = key => {
|
|
22
|
+
return map.get(key) || {};
|
|
23
|
+
};
|
|
24
|
+
const setLifecycleEvents = e => {
|
|
25
|
+
events = e;
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
deleteLifecycleEvents,
|
|
29
|
+
setLifecycleEvents,
|
|
30
|
+
getLifecycleEvents,
|
|
31
|
+
bindLifecycleEventsKey
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Reducers } from '@mic-rexjs/usecases';
|
|
2
|
+
export interface LifecycleEvents<T = unknown> {
|
|
3
|
+
/**
|
|
4
|
+
* 在渲染组件阶段触发:
|
|
5
|
+
*
|
|
6
|
+
* 第一次初始化,将 `entity` 与 `reducers` 相绑定的时候触发,仅一次。
|
|
7
|
+
*/
|
|
8
|
+
onBind(entity: T): void;
|
|
9
|
+
/**
|
|
10
|
+
* `unmount` 的时候触发。
|
|
11
|
+
*/
|
|
12
|
+
onUnbind(entity: T): void;
|
|
13
|
+
/**
|
|
14
|
+
* 非渲染阶段触发,随后会触发组件的更新:
|
|
15
|
+
*
|
|
16
|
+
* 只由相关 `reducers` 的调用行为触发;
|
|
17
|
+
* 不包括 `useUseCase(entity, usecase)` 中的 `entity` 变化触发。
|
|
18
|
+
*/
|
|
19
|
+
onChange(newEntity: T, oldEntity: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* 触发机制包括以下两点:
|
|
22
|
+
*
|
|
23
|
+
* 1. 由相关 `reducers` 的调用行为触发 - 非渲染阶段;
|
|
24
|
+
* 2. 由 `useUseCase(entity, usecase)` 中的 `entity` 变化触发 - 渲染阶段。
|
|
25
|
+
*/
|
|
26
|
+
onUpdate(newEntity: T, oldEntity: T): void;
|
|
27
|
+
}
|
|
28
|
+
export interface CaptureLifecycleEventsCallback<T> {
|
|
29
|
+
(): T;
|
|
30
|
+
}
|
|
31
|
+
export type LifecycleEventReducers = Reducers<{
|
|
32
|
+
deleteLifecycleEvents(key: React.Key): boolean;
|
|
33
|
+
bindLifecycleEventsKey<T>(key: React.Key): Partial<LifecycleEvents<T>>;
|
|
34
|
+
setLifecycleEvents<T>(events: Partial<LifecycleEvents<T>>): void;
|
|
35
|
+
getLifecycleEvents<T>(key: React.Key): Partial<LifecycleEvents<T>>;
|
|
36
|
+
}>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { lifecycleEventUseCase } from '../lifecycleEventUseCase';
|
|
2
|
+
import { entityUseCase } from '@mic-rexjs/usecases';
|
|
3
|
+
export const lifecycleUseCase = function () {
|
|
4
|
+
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
5
|
+
const onBind = options.onBind,
|
|
6
|
+
onUnbind = options.onUnbind,
|
|
7
|
+
onChange = options.onChange,
|
|
8
|
+
onUpdate = options.onUpdate;
|
|
9
|
+
const _lifecycleEventUseCas = lifecycleEventUseCase(),
|
|
10
|
+
setLifecycleEvents = _lifecycleEventUseCas.setLifecycleEvents;
|
|
11
|
+
const entityReducers = entityUseCase();
|
|
12
|
+
setLifecycleEvents({
|
|
13
|
+
onBind,
|
|
14
|
+
onUnbind,
|
|
15
|
+
onChange,
|
|
16
|
+
onUpdate
|
|
17
|
+
});
|
|
18
|
+
return {
|
|
19
|
+
...entityReducers
|
|
20
|
+
};
|
|
21
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { LifecycleEvents } from '../lifecycleEventUseCase/types';
|
|
2
|
+
import { EntityReducers } from '@mic-rexjs/usecases';
|
|
3
|
+
export interface LifecycleUseCaseOptions<T> extends Partial<LifecycleEvents<T>> {
|
|
4
|
+
}
|
|
5
|
+
export type LifecycleReducers<T> = EntityReducers<T, Record<never, never>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
|
-
import {
|
|
2
|
+
import { objectUtilsUseCase } from '../objectUtilsUseCase';
|
|
3
3
|
export const methodUseCase = () => {
|
|
4
|
-
const
|
|
5
|
-
|
|
4
|
+
const _objectUtilsUseCase = objectUtilsUseCase(),
|
|
5
|
+
isEqual = _objectUtilsUseCase.isEqual;
|
|
6
6
|
const cacheCall = (factory, options) => {
|
|
7
7
|
let cache;
|
|
8
8
|
const _ref = options || {},
|
|
@@ -12,7 +12,7 @@ export const methodUseCase = () => {
|
|
|
12
12
|
} : _ref$onShouldCache,
|
|
13
13
|
_ref$onCompare = _ref.onCompare,
|
|
14
14
|
onCompare = _ref$onCompare === void 0 ? (newArgs, oldArgs) => {
|
|
15
|
-
return
|
|
15
|
+
return isEqual(newArgs, oldArgs);
|
|
16
16
|
} : _ref$onCompare;
|
|
17
17
|
return function () {
|
|
18
18
|
const cacheable = onShouldCache();
|