@mic-rexjs/usecases-react 3.2.0 → 3.6.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.
Files changed (73) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.LICENSE.txt +0 -2
  3. package/es/components/RenderingEventTrigger/index.d.ts +2 -0
  4. package/es/components/RenderingEventTrigger/index.js +7 -0
  5. package/es/components/RenderingEventTrigger/types.d.ts +3 -0
  6. package/es/hooks/useContextualItem/index.js +2 -3
  7. package/es/hooks/useDepsKey/index.js +19 -9
  8. package/es/hooks/useEntity/index.d.ts +1 -4
  9. package/es/hooks/useEntity/index.js +59 -50
  10. package/es/hooks/useEntityInitializing/index.d.ts +2 -0
  11. package/es/hooks/useEntityInitializing/index.js +16 -0
  12. package/es/hooks/useExec/index.d.ts +2 -1
  13. package/es/hooks/useExec/index.js +3 -3
  14. package/es/hooks/useExec/types.d.ts +3 -0
  15. package/es/hooks/useProvider/index.d.ts +1 -1
  16. package/es/hooks/useProvider/index.js +7 -3
  17. package/es/hooks/useProvider/types.d.ts +1 -1
  18. package/es/hooks/useReducers/index.js +8 -6
  19. package/es/hooks/useStore/index.d.ts +1 -2
  20. package/es/hooks/useStore/index.js +55 -69
  21. package/es/hooks/useUseCase/index.js +5 -6
  22. package/es/hooks/useUseCase/index.test.js +92 -35
  23. package/es/index.d.ts +2 -2
  24. package/es/index.js +1 -1
  25. package/es/methods/runEntityInitializer/index.d.ts +3 -0
  26. package/es/methods/runEntityInitializer/index.js +67 -0
  27. package/es/methods/triggerWatchers/index.js +3 -3
  28. package/es/usecases/lifecycleEventUseCase/index.d.ts +3 -0
  29. package/es/usecases/lifecycleEventUseCase/index.js +34 -0
  30. package/es/usecases/lifecycleEventUseCase/types.d.ts +36 -0
  31. package/es/usecases/lifecycleEventUseCase/types.js +1 -0
  32. package/es/usecases/lifecycleUseCase/index.d.ts +2 -0
  33. package/es/usecases/lifecycleUseCase/index.js +21 -0
  34. package/es/usecases/lifecycleUseCase/types.d.ts +5 -0
  35. package/es/usecases/lifecycleUseCase/types.js +1 -0
  36. package/es/usecases/methodUseCase/index.js +4 -4
  37. package/es/usecases/objectUtilsUseCase/index.d.ts +2 -0
  38. package/es/usecases/objectUtilsUseCase/index.js +131 -0
  39. package/es/usecases/objectUtilsUseCase/types.d.ts +14 -0
  40. package/es/usecases/objectUtilsUseCase/types.js +1 -0
  41. package/lib/components/RenderingEventTrigger/index.js +13 -0
  42. package/lib/hooks/useContextualItem/index.js +3 -4
  43. package/lib/hooks/useDepsKey/index.js +19 -10
  44. package/lib/hooks/useEntity/index.js +59 -50
  45. package/lib/hooks/useEntityInitializing/index.js +22 -0
  46. package/lib/hooks/useExec/index.js +3 -3
  47. package/lib/hooks/useProvider/index.js +7 -3
  48. package/lib/hooks/useReducers/index.js +9 -7
  49. package/lib/hooks/useStore/index.js +54 -67
  50. package/lib/hooks/useUseCase/index.js +6 -7
  51. package/lib/hooks/useUseCase/index.test.js +86 -35
  52. package/lib/index.js +3 -3
  53. package/lib/methods/runEntityInitializer/index.js +73 -0
  54. package/lib/methods/triggerWatchers/index.js +3 -3
  55. package/lib/usecases/lifecycleEventUseCase/index.js +40 -0
  56. package/lib/usecases/lifecycleEventUseCase/types.js +5 -0
  57. package/lib/usecases/{lifeCycleUseCase → lifecycleUseCase}/index.js +14 -12
  58. package/lib/usecases/lifecycleUseCase/types.js +5 -0
  59. package/lib/usecases/methodUseCase/index.js +4 -4
  60. package/lib/usecases/objectUtilsUseCase/index.js +140 -0
  61. package/lib/usecases/objectUtilsUseCase/types.js +5 -0
  62. package/package.json +3 -3
  63. package/es/usecases/lifeCycleUseCase/index.d.ts +0 -2
  64. package/es/usecases/lifeCycleUseCase/index.js +0 -18
  65. package/es/usecases/lifeCycleUseCase/types.d.ts +0 -9
  66. package/es/usecases/valueUseCase/index.d.ts +0 -2
  67. package/es/usecases/valueUseCase/index.js +0 -168
  68. package/es/usecases/valueUseCase/types.d.ts +0 -21
  69. package/lib/usecases/valueUseCase/index.js +0 -219
  70. /package/es/{usecases/lifeCycleUseCase → components/RenderingEventTrigger}/types.js +0 -0
  71. /package/es/{usecases/valueUseCase → hooks/useExec}/types.js +0 -0
  72. /package/lib/{usecases/lifeCycleUseCase → components/RenderingEventTrigger}/types.js +0 -0
  73. /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, options, deps);
31
+ const store = useStore(unsafeEntity, entityContext, statuses, deps);
35
32
  const reducers = useReducers(usecase, context, store, statuses, options, deps);
36
- const entity = useEntity(unsafeEntity, store, reducers, statuses, options);
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, cacheCalls]);
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('`bindEntity` should be called when component mount', () => {
2002
- const bindEntity = jest.fn(entity => {
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 entityReducers = entityUseCase();
2007
+ const lifecycleReducers = lifecycleUseCase({
2008
+ onBind
2009
+ });
2007
2010
  return {
2008
- ...entityReducers,
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(bindEntity).toHaveBeenCalledTimes(1);
2021
- expect(bindEntity).toHaveBeenCalledWith(5);
2022
+ expect(onBind).toHaveBeenCalledTimes(1);
2023
+ expect(onBind).toHaveBeenCalledWith(5);
2022
2024
  });
2023
- test('`unbindEntity` should be called when component unmount', () => {
2024
- const unbindEntity = jest.fn(entity => {
2025
- void entity;
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 entityReducers = entityUseCase();
2031
+ const lifecycleReducers = lifecycleUseCase({
2032
+ onChange
2033
+ });
2029
2034
  return {
2030
- ...entityReducers,
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 = _renderHook37.unmount;
2043
- expect(unbindEntity).toHaveBeenCalledTimes(0);
2099
+ unmount = _renderHook39.unmount;
2100
+ expect(onUnbind).toHaveBeenCalledTimes(0);
2044
2101
  unmount();
2045
- expect(unbindEntity).toHaveBeenCalledTimes(1);
2046
- expect(unbindEntity).toHaveBeenCalledWith(100);
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 _renderHook38 = renderHook(() => {
2666
+ const _renderHook40 = renderHook(() => {
2610
2667
  return useUseCase(mathUseCase);
2611
2668
  }),
2612
- result = _renderHook38.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 _renderHook39 = renderHook(() => {
2674
+ const _renderHook41 = renderHook(() => {
2618
2675
  return useUseCase(mathUseCase);
2619
2676
  }),
2620
- result = _renderHook39.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 _renderHook40 = renderHook(() => {
2684
+ const _renderHook42 = renderHook(() => {
2628
2685
  return useUseCase(mockUseCase);
2629
2686
  }),
2630
- rerender = _renderHook40.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 _renderHook41 = renderHook(() => {
2694
+ const _renderHook43 = renderHook(() => {
2638
2695
  return useUseCase(mockUseCase, {}, [1, 'x']);
2639
2696
  }),
2640
- rerender = _renderHook41.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 _renderHook42 = renderHook(() => {
2705
+ const _renderHook44 = renderHook(() => {
2649
2706
  return useUseCase(mockUseCase, {}, [i++, 'x']);
2650
2707
  }),
2651
- rerender = _renderHook42.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 _renderHook43 = renderHook(() => {
2792
+ const _renderHook45 = renderHook(() => {
2736
2793
  return useUseCase(mathUseCase, {
2737
2794
  extraValue: 5
2738
2795
  });
2739
2796
  }),
2740
- result = _renderHook43.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 _renderHook44 = renderHook(() => {
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 = _renderHook44.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 _renderHook45 = renderHook(() => {
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 = _renderHook45.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 _renderHook46 = renderHook(() => {
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 = _renderHook46.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 { lifeCycleUseCase } from './usecases/lifeCycleUseCase';
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 { LifeCycleReducers, LifeCycleUseCaseOptions } from './usecases/lifeCycleUseCase/types';
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 { lifeCycleUseCase } from './usecases/lifeCycleUseCase';
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 { valueUseCase } from '../../usecases/valueUseCase';
2
+ import { objectUtilsUseCase } from '../../usecases/objectUtilsUseCase';
3
3
  export const triggerWatchers = (watch, newEntity, oldEntity) => {
4
- const _valueUseCase = valueUseCase(),
5
- matchProperty = _valueUseCase.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,3 @@
1
+ import { LifecycleEventReducers } from './types';
2
+ import { UseCase } from '@mic-rexjs/usecases';
3
+ export declare const lifecycleEventUseCase: UseCase<LifecycleEventReducers, object>;
@@ -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,2 @@
1
+ import { LifecycleReducers, LifecycleUseCaseOptions } from './types';
2
+ export declare const lifecycleUseCase: <T>(options?: LifecycleUseCaseOptions<T>) => LifecycleReducers<T>;
@@ -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 { valueUseCase } from '../valueUseCase';
2
+ import { objectUtilsUseCase } from '../objectUtilsUseCase';
3
3
  export const methodUseCase = () => {
4
- const _valueUseCase = valueUseCase(),
5
- matchValue = _valueUseCase.matchValue;
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 matchValue(newArgs, oldArgs);
15
+ return isEqual(newArgs, oldArgs);
16
16
  } : _ref$onCompare;
17
17
  return function () {
18
18
  const cacheable = onShouldCache();
@@ -0,0 +1,2 @@
1
+ import { ObjectUtilsReducers } from './types';
2
+ export declare const objectUtilsUseCase: () => ObjectUtilsReducers;