@mic-rexjs/usecases-react 2.10.1 → 2.10.3

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 (96) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.LICENSE.txt +4 -2
  3. package/es/components/SafeUseCaseFragment/index.js +1 -1
  4. package/es/components/UseCaseFragment/index.js +4 -3
  5. package/es/components/UseCaseFragment/types.d.ts +1 -1
  6. package/es/entities/matchPropertyFailedResult/types.d.ts +7 -0
  7. package/es/hooks/useArgumentTypes/index.d.ts +1 -1
  8. package/es/hooks/useArgumentTypes/index.js +3 -4
  9. package/es/hooks/useContext/index.d.ts +2 -2
  10. package/es/hooks/useContext/index.test.js +2 -2
  11. package/es/hooks/useContextualItem/index.d.ts +1 -1
  12. package/es/hooks/useContextualItem/index.js +15 -7
  13. package/es/hooks/useDepsKey/index.d.ts +2 -0
  14. package/es/hooks/useDepsKey/index.js +7 -0
  15. package/es/hooks/useEntity/index.d.ts +1 -1
  16. package/es/hooks/useEntity/index.js +6 -6
  17. package/es/hooks/useEntityReducers/index.d.ts +4 -0
  18. package/es/hooks/useEntityReducers/index.js +18 -0
  19. package/es/hooks/useFullArguments/index.d.ts +3 -3
  20. package/es/hooks/useFullArguments/types.d.ts +3 -2
  21. package/es/hooks/useIsRenderingRef/index.js +3 -3
  22. package/es/hooks/useProvider/index.d.ts +3 -3
  23. package/es/hooks/useProvider/index.js +3 -3
  24. package/es/hooks/useProvider/types.d.ts +0 -1
  25. package/es/hooks/useReducers/index.d.ts +4 -0
  26. package/es/hooks/useReducers/index.js +13 -0
  27. package/es/hooks/useRuntimeEntity/index.d.ts +1 -1
  28. package/es/hooks/useRuntimeEntity/index.js +6 -5
  29. package/es/hooks/useStatuses/index.d.ts +2 -2
  30. package/es/hooks/useStatuses/index.js +1 -1
  31. package/es/hooks/useUseCase/index.js +14 -13
  32. package/es/hooks/useUseCase/index.test.js +10 -6
  33. package/es/hooks/useUseCase/types.d.ts +11 -14
  34. package/es/methods/initEntityReducers/index.d.ts +2 -2
  35. package/es/methods/triggerWatchers/index.js +4 -9
  36. package/es/types.d.ts +3 -0
  37. package/es/usecases/contextUseCase/index.js +2 -2
  38. package/es/usecases/contextUseCase/types.d.ts +3 -4
  39. package/es/usecases/methodUseCase/index.d.ts +2 -0
  40. package/es/usecases/methodUseCase/index.js +55 -0
  41. package/es/usecases/methodUseCase/types.d.ts +21 -0
  42. package/es/usecases/valueUseCase/index.d.ts +2 -0
  43. package/es/usecases/valueUseCase/index.js +136 -0
  44. package/es/usecases/valueUseCase/types.d.ts +16 -0
  45. package/es/usecases/valueUseCase/types.js +1 -0
  46. package/lib/components/SafeUseCaseFragment/index.js +1 -1
  47. package/lib/components/UseCaseFragment/index.js +4 -3
  48. package/lib/hooks/useArgumentTypes/index.js +3 -4
  49. package/lib/hooks/useContext/index.test.js +2 -2
  50. package/lib/hooks/useContextualItem/index.js +15 -6
  51. package/lib/hooks/useDepsKey/index.js +18 -0
  52. package/lib/hooks/useEntity/index.js +6 -6
  53. package/lib/hooks/useEntityReducers/index.js +30 -0
  54. package/lib/hooks/useIsRenderingRef/index.js +2 -2
  55. package/lib/hooks/useProvider/index.js +4 -6
  56. package/lib/hooks/useReducers/index.js +20 -0
  57. package/lib/hooks/useRuntimeEntity/index.js +8 -5
  58. package/lib/hooks/useStatuses/index.js +1 -1
  59. package/lib/hooks/useUseCase/index.js +18 -15
  60. package/lib/hooks/useUseCase/index.test.js +222 -218
  61. package/lib/methods/triggerWatchers/index.js +5 -9
  62. package/lib/usecases/contextUseCase/index.js +2 -2
  63. package/lib/usecases/methodUseCase/index.js +79 -0
  64. package/lib/usecases/valueUseCase/index.js +198 -0
  65. package/lib/usecases/valueUseCase/types.js +5 -0
  66. package/package.json +45 -40
  67. package/es/hooks/useCompareDeps/index.d.ts +0 -1
  68. package/es/hooks/useCompareDeps/index.js +0 -11
  69. package/es/methods/cacheCall/index.d.ts +0 -2
  70. package/es/methods/cacheCall/index.js +0 -26
  71. package/es/methods/cacheCall/types.d.ts +0 -13
  72. package/es/methods/cacheCalls/index.d.ts +0 -2
  73. package/es/methods/cacheCalls/index.js +0 -8
  74. package/es/methods/captureCalls/index.d.ts +0 -2
  75. package/es/methods/captureCalls/index.js +0 -14
  76. package/es/methods/captureCalls/types.d.ts +0 -4
  77. package/es/methods/compareProperty/index.d.ts +0 -2
  78. package/es/methods/compareProperty/index.js +0 -34
  79. package/es/methods/compareProperty/types.d.ts +0 -3
  80. package/es/methods/hasField/index.d.ts +0 -1
  81. package/es/methods/hasField/index.js +0 -6
  82. package/es/methods/isSameArray/index.d.ts +0 -1
  83. package/es/methods/isSameArray/index.js +0 -14
  84. package/lib/hooks/useCompareDeps/index.js +0 -17
  85. package/lib/methods/cacheCall/index.js +0 -41
  86. package/lib/methods/cacheCalls/index.js +0 -19
  87. package/lib/methods/captureCalls/index.js +0 -23
  88. package/lib/methods/compareProperty/index.js +0 -49
  89. package/lib/methods/hasField/index.js +0 -14
  90. package/lib/methods/isSameArray/index.js +0 -20
  91. /package/es/{methods/cacheCall → entities/matchPropertyFailedResult}/types.js +0 -0
  92. /package/es/{methods/captureCalls/types.js → types.js} +0 -0
  93. /package/es/{methods/compareProperty → usecases/methodUseCase}/types.js +0 -0
  94. /package/lib/{methods/cacheCall → entities/matchPropertyFailedResult}/types.js +0 -0
  95. /package/lib/{methods/captureCalls/types.js → types.js} +0 -0
  96. /package/lib/{methods/compareProperty → usecases/methodUseCase}/types.js +0 -0
@@ -1,14 +1,9 @@
1
- import { compareProperty } from '../compareProperty';
1
+ import { valueUseCase } from '../../usecases/valueUseCase';
2
2
  export const triggerWatchers = (watch, newEntity, oldEntity) => {
3
+ const { matchProperty } = valueUseCase();
3
4
  for (const [fieldPath, watcher] of Object.entries(watch)) {
4
- compareProperty(oldEntity, newEntity, fieldPath, (oldValue, newValue, fieldPaths) => {
5
- watcher({
6
- fieldPaths,
7
- newEntity,
8
- oldEntity,
9
- newValue,
10
- oldValue,
11
- });
5
+ matchProperty(oldEntity, newEntity, fieldPath, (result) => {
6
+ watcher(result);
12
7
  });
13
8
  }
14
9
  };
package/es/types.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { RestArguments } from '@mic-rexjs/usecases/es/types';
2
+ export interface Dependencies extends RestArguments {
3
+ }
@@ -1,6 +1,6 @@
1
1
  import { createUseCase } from '@mic-rexjs/usecases';
2
- import { ArgumentTypes } from '../../enums/ArgumentTypes';
3
2
  import { createContext } from 'react';
3
+ import { ArgumentTypes } from '../../enums/ArgumentTypes';
4
4
  import { Statuses } from '../../enums/Statuses';
5
5
  export const contextUseCase = createUseCase(() => {
6
6
  const referenceMap = new Map();
@@ -18,7 +18,7 @@ export const contextUseCase = createUseCase(() => {
18
18
  };
19
19
  const getUseCaseContext = (usecase) => {
20
20
  if (!referenceMap.has(usecase)) {
21
- return null;
21
+ return defaultUseCaseContext;
22
22
  }
23
23
  const { value } = referenceMap.get(usecase);
24
24
  return value;
@@ -1,8 +1,7 @@
1
- /// <reference types="react" />
2
- import { ArgumentTypes } from '../../enums/ArgumentTypes';
3
- import { Statuses } from '../../enums/Statuses';
4
1
  import { AsyncEntityGenerator, EntityGenerator, EntityReducer, EntityStore, ReducerKeys, Reducers } from '@mic-rexjs/usecases';
5
2
  import { EntityReducerMap, InferableUseCase, ReducerMap } from '@mic-rexjs/usecases/es/types';
3
+ import { ArgumentTypes } from '../../enums/ArgumentTypes';
4
+ import { Statuses } from '../../enums/Statuses';
6
5
  export type ContextualEntityReducer<T, TEntityReducer extends EntityReducer<T>> = TEntityReducer extends (entity: infer TEntity, ...args: infer TArgs) => infer TReturn ? (...args: TArgs) => TReturn extends AsyncEntityGenerator<TEntity, infer TResult> ? Promise<TResult> : TReturn extends EntityGenerator<TEntity, infer TResult> ? TResult : TReturn : never;
7
6
  export type ContextualEntityReducers<T, TEntityReducers extends EntityReducerMap<T>> = {
8
7
  [K in ReducerKeys<TEntityReducers>]: ContextualEntityReducer<T, TEntityReducers[K]>;
@@ -22,7 +21,7 @@ export interface ContextReference<T> {
22
21
  }
23
22
  export type ContextReducers = Reducers<{
24
23
  createContextValue<T, TReducers extends ReducerMap>(store: EntityStore<T>, reducers: TReducers, statuses: Statuses): ContextValue<TReducers>;
25
- getUseCaseContext<T extends ReducerMap, TUseCaseOptions extends object>(usecase: InferableUseCase<T, TUseCaseOptions>): Context<ContextValue<T>> | null;
24
+ getUseCaseContext<T extends ReducerMap, TUseCaseOptions extends object>(usecase: InferableUseCase<T, TUseCaseOptions>): Context<ContextValue<T>>;
26
25
  registerUseCase<T extends ReducerMap, TUseCaseOptions extends object>(usecase: InferableUseCase<T, TUseCaseOptions>, argumentTypes: ArgumentTypes): Context<ContextValue<T>>;
27
26
  unregisterUseCase<T extends ReducerMap, TUseCaseOptions extends object>(usecase: InferableUseCase<T, TUseCaseOptions>, argumentTypes: ArgumentTypes): boolean;
28
27
  }>;
@@ -0,0 +1,2 @@
1
+ import { MethodReducers } from './types';
2
+ export declare const methodUseCase: () => MethodReducers;
@@ -0,0 +1,55 @@
1
+ import { valueUseCase } from '../valueUseCase';
2
+ export const methodUseCase = () => {
3
+ const { isValueMatched } = valueUseCase();
4
+ const cacheCall = (factory, options) => {
5
+ let cache;
6
+ const { onShouldCache = () => {
7
+ return true;
8
+ }, onCompare = (newArgs, oldArgs) => {
9
+ return isValueMatched(newArgs, oldArgs);
10
+ }, } = options || {};
11
+ return ((...args) => {
12
+ const cacheable = onShouldCache();
13
+ if (cache && cacheable) {
14
+ const { parameters, returnValue } = cache;
15
+ if (onCompare(parameters, args)) {
16
+ return returnValue;
17
+ }
18
+ }
19
+ const returnValue = factory(...args);
20
+ if (cacheable) {
21
+ cache = {
22
+ parameters: args,
23
+ returnValue,
24
+ };
25
+ }
26
+ return returnValue;
27
+ });
28
+ };
29
+ const cacheCalls = (sourceFactories, options) => {
30
+ const cachedFactories = {};
31
+ Object.entries(sourceFactories).forEach(([key, factory]) => {
32
+ cachedFactories[key] = cacheCall(factory, options);
33
+ });
34
+ return cachedFactories;
35
+ };
36
+ const captureCalls = (obj, callback) => {
37
+ const newObj = {};
38
+ Object.keys(obj).forEach((key) => {
39
+ const value = obj[key];
40
+ if (typeof value === 'function') {
41
+ newObj[key] = ((...args) => {
42
+ return callback(key, args);
43
+ });
44
+ return;
45
+ }
46
+ newObj[key] = value;
47
+ });
48
+ return newObj;
49
+ };
50
+ return {
51
+ cacheCall,
52
+ cacheCalls,
53
+ captureCalls,
54
+ };
55
+ };
@@ -0,0 +1,21 @@
1
+ import { Reducers } from '@mic-rexjs/usecases';
2
+ import { RestArguments } from '@mic-rexjs/usecases/es/types';
3
+ export interface CacheableFactory {
4
+ (...args: RestArguments): unknown;
5
+ }
6
+ export interface CacheCallOptions {
7
+ onShouldCache?(): boolean;
8
+ onCompare?(newArgs: RestArguments, oldArgs: RestArguments): boolean;
9
+ }
10
+ export interface CallCache<T extends CacheableFactory> {
11
+ parameters: Parameters<T>;
12
+ returnValue: ReturnType<T>;
13
+ }
14
+ export interface CaptureCallFactory {
15
+ <T>(key: string, args: RestArguments): T;
16
+ }
17
+ export type MethodReducers = Reducers<{
18
+ cacheCall<T extends CacheableFactory>(factory: T, options?: CacheCallOptions): T;
19
+ cacheCalls<T extends Record<string, CacheableFactory>>(sourceFactories: T, options?: CacheCallOptions): T;
20
+ captureCalls<T extends object>(obj: T, callback: CaptureCallFactory): T;
21
+ }>;
@@ -0,0 +1,2 @@
1
+ import { ValueUseCase } from './types';
2
+ export declare const valueUseCase: ValueUseCase;
@@ -0,0 +1,136 @@
1
+ import { createUseCase, entityUseCase } from '@mic-rexjs/usecases';
2
+ export const valueUseCase = createUseCase(() => {
3
+ let keyIndex = 0;
4
+ return () => {
5
+ let prevKeyIndex = keyIndex++;
6
+ const entityReducers = entityUseCase();
7
+ const hasField = (entity, field) => {
8
+ if (typeof entity !== 'object' || entity === null) {
9
+ return false;
10
+ }
11
+ return Object.hasOwn(entity, field);
12
+ };
13
+ const isValueChanged = (entity, value) => {
14
+ return entity !== value;
15
+ };
16
+ const isValueMatched = (entity, value) => {
17
+ if (entity === value) {
18
+ return true;
19
+ }
20
+ const isObject1 = typeof entity === 'object' && entity !== null;
21
+ const isObject2 = typeof value === 'object' && value !== null;
22
+ if (!isObject1 || !isObject2) {
23
+ return false;
24
+ }
25
+ const keys1 = Object.keys(entity);
26
+ const keys2 = Object.keys(value);
27
+ const { length: length1 } = keys1;
28
+ const { length: length2 } = keys2;
29
+ if (length1 !== length2) {
30
+ return false;
31
+ }
32
+ for (const key of keys1) {
33
+ const value1 = entity[key];
34
+ const value2 = value[key];
35
+ if (value1 === value2) {
36
+ continue;
37
+ }
38
+ return false;
39
+ }
40
+ return true;
41
+ };
42
+ const matchProperty = (entity, value, fieldPath, onFailed) => {
43
+ let allMatched = true;
44
+ let currentFieldPath = fieldPath;
45
+ const list = [
46
+ {
47
+ fieldPaths: [],
48
+ newEntity: value,
49
+ newValue: value,
50
+ oldEntity: entity,
51
+ oldValue: entity,
52
+ },
53
+ ];
54
+ do {
55
+ const { oldValue, newValue, fieldPaths } = list.shift();
56
+ const [, key = currentFieldPath, subFieldPath = ''] = currentFieldPath.match(/^([^.]+)\.(.+)$/) || [];
57
+ const hasOldField = hasField(oldValue, key);
58
+ const hasNewField = hasField(newValue, key);
59
+ if (hasOldField || hasNewField) {
60
+ const subOldValue = hasOldField ? oldValue[key] : void 0;
61
+ const subNewValue = hasNewField ? newValue[key] : void 0;
62
+ const result = {
63
+ fieldPaths: [...fieldPaths, key],
64
+ newEntity: value,
65
+ newValue: subNewValue,
66
+ oldEntity: entity,
67
+ oldValue: subOldValue,
68
+ };
69
+ if (subFieldPath) {
70
+ currentFieldPath = subFieldPath;
71
+ list.push(result);
72
+ continue;
73
+ }
74
+ if (subOldValue === subNewValue) {
75
+ continue;
76
+ }
77
+ allMatched = false;
78
+ onFailed?.(result);
79
+ continue;
80
+ }
81
+ if (/^\d+^/.test(key)) {
82
+ continue;
83
+ }
84
+ const oldArray = Array.isArray(oldValue) ? oldValue : [];
85
+ const newArray = Array.isArray(newValue) ? newValue : [];
86
+ const { length: oldLength } = oldArray;
87
+ const { length: newLength } = newArray;
88
+ const length = Math.max(oldLength, newLength);
89
+ for (let i = 0; i < length; i++) {
90
+ list.push({
91
+ fieldPaths: [...fieldPaths, `${i}`],
92
+ newEntity: value,
93
+ newValue: newArray[i],
94
+ oldEntity: entity,
95
+ oldValue: oldArray[i],
96
+ });
97
+ }
98
+ } while (list.length > 0);
99
+ return allMatched;
100
+ };
101
+ const recordValue = function* (entity, value) {
102
+ const changed = isValueChanged(entity, value);
103
+ if (!changed) {
104
+ return false;
105
+ }
106
+ yield value;
107
+ return true;
108
+ };
109
+ const recordValueMatch = function* (entity, value) {
110
+ const matched = isValueMatched(entity, value);
111
+ if (matched) {
112
+ return true;
113
+ }
114
+ yield value;
115
+ return false;
116
+ };
117
+ const recordValueMatchWith = function* (entity, value, key = keyIndex + 1) {
118
+ const matched = yield* recordValueMatch(entity, value);
119
+ if (!matched) {
120
+ // 不管是不是使用 `keyIndex` 生成的 `key`,都自增一次,如果是,则可以保持一致
121
+ keyIndex++;
122
+ prevKeyIndex = key;
123
+ }
124
+ return prevKeyIndex;
125
+ };
126
+ return {
127
+ ...entityReducers,
128
+ isValueChanged,
129
+ isValueMatched,
130
+ matchProperty,
131
+ recordValue,
132
+ recordValueMatch,
133
+ recordValueMatchWith,
134
+ };
135
+ };
136
+ });
@@ -0,0 +1,16 @@
1
+ import { EntityGenerator, EntityReducers } from '@mic-rexjs/usecases';
2
+ import { MatchPropertyFailedResult } from '../../entities/matchPropertyFailedResult/types';
3
+ export interface MatchPropertyFailedCallback<T> {
4
+ (result: MatchPropertyFailedResult<T>): void;
5
+ }
6
+ export type ValueReducers<T> = EntityReducers<T, {
7
+ isValueChanged<S extends T>(entity: S, value: S): boolean;
8
+ isValueMatched<S extends T>(entity: S, value: S): boolean;
9
+ matchProperty<S extends T>(entity: S, value: S, fieldPath: string, onFailed?: MatchPropertyFailedCallback<S>): boolean;
10
+ recordValue<S extends T>(entity: S, value: S): EntityGenerator<S, boolean>;
11
+ recordValueMatch<S extends T>(entity: S, value: S): EntityGenerator<S, boolean>;
12
+ recordValueMatchWith<S extends T>(entity: S, value: S, key?: number): EntityGenerator<S, number>;
13
+ }>;
14
+ export interface ValueUseCase {
15
+ <T>(): ValueReducers<T>;
16
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.SafeUseCaseFragment = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _jsxRuntime = require("react/jsx-runtime");
10
- var _react = require("react");
11
10
  var _useUseCase3 = require("../../hooks/useUseCase");
12
11
  var _ahooks = require("ahooks");
12
+ var _react = require("react");
13
13
  var SafeUseCaseFragment = exports.SafeUseCaseFragment = function SafeUseCaseFragment(_ref) {
14
14
  var usecase = _ref.usecase,
15
15
  watch = _ref.watch,
@@ -8,10 +8,10 @@ exports.UseCaseFragment = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
10
  var _jsxRuntime = require("react/jsx-runtime");
11
- var _react = require("react");
12
11
  var _useUseCase2 = require("../../hooks/useUseCase");
13
- var _contextUseCase = require("../../usecases/contextUseCase");
14
12
  var _SafeUseCaseFragment = require("../SafeUseCaseFragment");
13
+ var _react = require("react");
14
+ var _contextUseCase = require("../../usecases/contextUseCase");
15
15
  var _excluded = ["usecase"];
16
16
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
17
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -21,8 +21,9 @@ var UseCaseFragment = exports.UseCaseFragment = function UseCaseFragment(_ref) {
21
21
  var _useUseCase = (0, _useUseCase2.useUseCase)(_contextUseCase.contextUseCase),
22
22
  getUseCaseContext = _useUseCase.getUseCaseContext;
23
23
  var context = getUseCaseContext(usecase);
24
+ var contextValue = (0, _react.useContext)(context);
24
25
  return (0, _jsxRuntime.jsx)(_react.Fragment, {
25
- children: context === null ? null : (0, _jsxRuntime.jsx)(_SafeUseCaseFragment.SafeUseCaseFragment, _objectSpread({
26
+ children: contextValue === null ? null : (0, _jsxRuntime.jsx)(_SafeUseCaseFragment.SafeUseCaseFragment, _objectSpread({
26
27
  usecase: usecase
27
28
  }, props))
28
29
  });
@@ -7,17 +7,16 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.useArgumentTypes = void 0;
8
8
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
- var _ArgumentTypes = require("../../enums/ArgumentTypes");
11
10
  var _useConstant = require("../useConstant");
11
+ var _ArgumentTypes = require("../../enums/ArgumentTypes");
12
12
  var useArgumentTypes = exports.useArgumentTypes = function useArgumentTypes(args) {
13
13
  return (0, _useConstant.useConstant)(function () {
14
- var types = _ArgumentTypes.ArgumentTypes.None;
15
14
  var _args = (0, _slicedToArray2["default"])(args, 2),
16
15
  arg2 = _args[1];
17
16
  var type2 = (0, _typeof2["default"])(arg2);
18
17
  if (type2 === 'function') {
19
- types |= _ArgumentTypes.ArgumentTypes.Entity;
18
+ return _ArgumentTypes.ArgumentTypes.Entity;
20
19
  }
21
- return types;
20
+ return _ArgumentTypes.ArgumentTypes.None;
22
21
  });
23
22
  };
@@ -2,11 +2,11 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
5
+ var _ = require(".");
5
6
  var _globals = require("@jest/globals");
6
7
  var _react = require("@testing-library/react");
7
- var _ = require(".");
8
- var _ArgumentTypes = require("../../enums/ArgumentTypes");
9
8
  var _react2 = require("react");
9
+ var _ArgumentTypes = require("../../enums/ArgumentTypes");
10
10
  var testUseCase = function testUseCase() {
11
11
  return {};
12
12
  };
@@ -4,25 +4,34 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useContextualItem = void 0;
7
+ var _useReducers2 = require("../useReducers");
7
8
  var _ahooks = require("ahooks");
8
9
  var _Statuses = require("../../enums/Statuses");
9
- var _cacheCall = require("../../methods/cacheCall");
10
+ var _methodUseCase = require("../../usecases/methodUseCase");
10
11
  var useContextualItem = exports.useContextualItem = function useContextualItem(contextItem, statuses, createFactory) {
11
12
  var depsKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
12
13
  var factoryRef = (0, _ahooks.useLatest)(createFactory);
13
- var create = (0, _ahooks.useCreation)(function () {
14
+ var _useReducers = (0, _useReducers2.useReducers)(_methodUseCase.methodUseCase),
15
+ cacheCall = _useReducers.cacheCall;
16
+ var onCache = (0, _ahooks.useMemoizedFn)(function () {
17
+ var currentFactory = factoryRef.current;
14
18
  void depsKey;
15
- return (0, _cacheCall.cacheCall)(factoryRef.current, {
19
+ // 防止在以下 `onCreate()` 多次调用实际 `factory`
20
+ return cacheCall(currentFactory, {
16
21
  onCompare: function onCompare() {
17
22
  return true;
18
23
  }
19
24
  });
20
- }, [depsKey, factoryRef]);
25
+ });
26
+ var onCreate = (0, _ahooks.useCreation)(function () {
27
+ void depsKey;
28
+ return onCache();
29
+ }, [depsKey, onCache]);
21
30
  return (0, _ahooks.useCreation)(function () {
22
31
  var rootEnabled = (statuses & _Statuses.Statuses.RootEnabled) === _Statuses.Statuses.RootEnabled;
23
32
  if (!rootEnabled && contextItem) {
24
33
  return contextItem;
25
34
  }
26
- return create();
27
- }, [statuses, contextItem, create]);
35
+ return onCreate();
36
+ }, [statuses, contextItem, onCreate]);
28
37
  };
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useDepsKey = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _useEntityReducers2 = require("../useEntityReducers");
10
+ var _valueUseCase = require("../../usecases/valueUseCase");
11
+ var useDepsKey = exports.useDepsKey = function useDepsKey(deps) {
12
+ var _useEntityReducers = (0, _useEntityReducers2.useEntityReducers)(deps, _valueUseCase.valueUseCase),
13
+ recordValueMatchWith = _useEntityReducers.recordValueMatchWith;
14
+ var _recordValueMatchWith = recordValueMatchWith(deps),
15
+ _recordValueMatchWith2 = (0, _slicedToArray2["default"])(_recordValueMatchWith, 2),
16
+ depsKey = _recordValueMatchWith2[1];
17
+ return depsKey;
18
+ };
@@ -4,16 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useEntity = void 0;
7
- var _react = require("react");
8
- var _usecases = require("@mic-rexjs/usecases");
9
- var _Statuses = require("../../enums/Statuses");
10
7
  var _useContextualItem = require("../useContextualItem");
8
+ var _useRuntimeEntity = require("../useRuntimeEntity");
9
+ var _usecases = require("@mic-rexjs/usecases");
11
10
  var _ahooks = require("ahooks");
11
+ var _react = require("react");
12
+ var _Statuses = require("../../enums/Statuses");
12
13
  var _triggerWatchers = require("../../methods/triggerWatchers");
13
- var _useRuntimeEntity = require("../useRuntimeEntity");
14
14
  var useEntity = exports.useEntity = function useEntity(statuses, entityArg, contextStore, options, depsKey) {
15
15
  var update = (0, _ahooks.useUpdate)();
16
- var storeRef = (0, _react.useRef)();
16
+ var storeRef = (0, _react.useRef)(null);
17
17
  var optionsRef = (0, _ahooks.useLatest)(options);
18
18
  var contextEntity = contextStore ? contextStore.value : null;
19
19
  var entityEnabled = (statuses & _Statuses.Statuses.EntityEnabled) === _Statuses.Statuses.EntityEnabled;
@@ -47,7 +47,7 @@ var useEntity = exports.useEntity = function useEntity(statuses, entityArg, cont
47
47
  });
48
48
  if (entityRootEnabled) {
49
49
  // 执行同步操作
50
- store.value = runtimeEntity;
50
+ store.setValue(runtimeEntity, true);
51
51
  }
52
52
  /**
53
53
  * 需要马上 `watch`,因为 `useEffect` 在子组件内优先执行,
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useEntityReducers = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _useConstant2 = require("../useConstant");
10
+ var _usecases = require("@mic-rexjs/usecases");
11
+ var _ahooks = require("ahooks");
12
+ var _valueUseCase = require("../../usecases/valueUseCase");
13
+ var useEntityReducers = exports.useEntityReducers = function useEntityReducers(initailEntity, usecase, options) {
14
+ var deps = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
15
+ var _useConstant = (0, _useConstant2.useConstant)(function () {
16
+ return (0, _usecases.createEntityReducers)(deps, _valueUseCase.valueUseCase);
17
+ }),
18
+ recordValueMatchWith = _useConstant.recordValueMatchWith;
19
+ var _recordValueMatchWith = recordValueMatchWith(deps),
20
+ _recordValueMatchWith2 = (0, _slicedToArray2["default"])(_recordValueMatchWith, 2),
21
+ depsKey = _recordValueMatchWith2[1];
22
+ var onCreate = (0, _ahooks.useMemoizedFn)(function () {
23
+ return (0, _usecases.createEntityReducers)(initailEntity, usecase, options);
24
+ });
25
+ return (0, _ahooks.useCreation)(function () {
26
+ void depsKey;
27
+ void usecase;
28
+ return onCreate();
29
+ }, [depsKey, usecase, onCreate]);
30
+ };
@@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useIsRenderingRef = void 0;
7
+ var _ahooks = require("ahooks");
7
8
  var _react = require("react");
8
9
  var useIsRenderingRef = exports.useIsRenderingRef = function useIsRenderingRef() {
9
- var ref = (0, _react.useRef)(true);
10
- ref.current = true;
10
+ var ref = (0, _ahooks.useLatest)(true);
11
11
  (0, _react.useEffect)(function () {
12
12
  ref.current = false;
13
13
  });
@@ -1,19 +1,17 @@
1
1
  "use strict";
2
2
 
3
- var _typeof = require("@babel/runtime/helpers/typeof");
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.useProvider = void 0;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _ahooks = require("ahooks");
10
8
  var _useConstantFn = require("../useConstantFn");
9
+ var _ahooks = require("ahooks");
10
+ var _react = _interopRequireDefault(require("react"));
11
11
  var _contextUseCase2 = require("../../usecases/contextUseCase");
12
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
13
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
14
12
  var useProvider = exports.useProvider = function useProvider(statuses, context, store, reducers) {
15
13
  var entity = store.value;
16
- var contextValue = (0, _react.useMemo)(function () {
14
+ var contextValue = (0, _ahooks.useCreation)(function () {
17
15
  var _contextUseCase = (0, _contextUseCase2.contextUseCase)(),
18
16
  createContextValue = _contextUseCase.createContextValue;
19
17
  void entity;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useReducers = void 0;
7
+ var _useDepsKey = require("../useDepsKey");
8
+ var _ahooks = require("ahooks");
9
+ var useReducers = exports.useReducers = function useReducers(usecase, options) {
10
+ var deps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
11
+ var depsKey = (0, _useDepsKey.useDepsKey)(deps);
12
+ var onCreate = (0, _ahooks.useMemoizedFn)(function () {
13
+ return usecase(options);
14
+ });
15
+ return (0, _ahooks.useCreation)(function () {
16
+ void depsKey;
17
+ void usecase;
18
+ return onCreate();
19
+ }, [depsKey, usecase, onCreate]);
20
+ };
@@ -4,21 +4,24 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useRuntimeEntity = void 0;
7
+ var _useEntityReducers2 = require("../useEntityReducers");
7
8
  var _Statuses = require("../../enums/Statuses");
8
- var _react = require("react");
9
+ var _valueUseCase = require("../../usecases/valueUseCase");
9
10
  var useRuntimeEntity = exports.useRuntimeEntity = function useRuntimeEntity(store, entityArg, contextEntity, statuses) {
10
- var prevEntityArgRef = (0, _react.useRef)(entityArg);
11
+ var _useEntityReducers = (0, _useEntityReducers2.useEntityReducers)(entityArg, _valueUseCase.valueUseCase),
12
+ isValueChanged = _useEntityReducers.isValueChanged,
13
+ recordValue = _useEntityReducers.recordValue;
14
+ var changed = isValueChanged(entityArg);
11
15
  var entityRootDisabled = (statuses & _Statuses.Statuses.EntityRootEnabled) !== _Statuses.Statuses.EntityRootEnabled;
12
16
  if (entityRootDisabled) {
13
17
  return contextEntity;
14
18
  }
15
19
  var isFunction = typeof entityArg === 'function';
16
- var prevEntityArg = prevEntityArgRef.current;
17
20
  switch (true) {
18
21
  case isFunction:
19
- case prevEntityArg === entityArg:
22
+ case !changed:
20
23
  return store.value;
21
24
  }
22
- prevEntityArgRef.current = entityArg;
25
+ recordValue(entityArg);
23
26
  return entityArg;
24
27
  };
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.useStatuses = void 0;
7
+ var _ahooks = require("ahooks");
7
8
  var _ArgumentTypes = require("../../enums/ArgumentTypes");
8
9
  var _Statuses = require("../../enums/Statuses");
9
- var _ahooks = require("ahooks");
10
10
  var useStatuses = exports.useStatuses = function useStatuses(argumentTypes, contextValue) {
11
11
  return (0, _ahooks.useCreation)(function () {
12
12
  var statuses = _Statuses.Statuses.None;