@mic-rexjs/usecases-react 2.10.3 → 2.11.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 (38) hide show
  1. package/dist/index.min.js +1 -1
  2. package/es/hooks/useConstantEntityReducers/index.d.ts +3 -0
  3. package/es/hooks/useConstantEntityReducers/index.js +7 -0
  4. package/es/hooks/useConstantReducers/index.d.ts +3 -0
  5. package/es/hooks/useConstantReducers/index.js +6 -0
  6. package/es/hooks/useContextualItem/index.d.ts +2 -1
  7. package/es/hooks/useContextualItem/index.js +5 -3
  8. package/es/hooks/useDepsKey/index.d.ts +1 -1
  9. package/es/hooks/useDepsKey/index.js +2 -2
  10. package/es/hooks/useEntity/index.d.ts +2 -1
  11. package/es/hooks/useEntity/index.js +11 -3
  12. package/es/hooks/useFullArguments/types.d.ts +3 -3
  13. package/es/hooks/useRuntimeEntity/index.d.ts +2 -1
  14. package/es/hooks/useRuntimeEntity/index.js +4 -3
  15. package/es/hooks/useUseCase/index.js +13 -8
  16. package/es/hooks/useUseCase/index.test.js +60 -0
  17. package/es/hooks/useUseCase/types.d.ts +3 -3
  18. package/es/usecases/valueUseCase/index.js +50 -16
  19. package/es/usecases/valueUseCase/types.d.ts +7 -2
  20. package/lib/hooks/useConstantEntityReducers/index.js +13 -0
  21. package/lib/hooks/useConstantReducers/index.js +12 -0
  22. package/lib/hooks/useContextualItem/index.js +6 -4
  23. package/lib/hooks/useDepsKey/index.js +3 -3
  24. package/lib/hooks/useEntity/index.js +15 -4
  25. package/lib/hooks/useRuntimeEntity/index.js +6 -5
  26. package/lib/hooks/useUseCase/index.js +19 -11
  27. package/lib/hooks/useUseCase/index.test.js +152 -72
  28. package/lib/usecases/valueUseCase/index.js +86 -42
  29. package/package.json +2 -2
  30. package/es/hooks/useEntityReducers/index.d.ts +0 -4
  31. package/es/hooks/useEntityReducers/index.js +0 -18
  32. package/es/hooks/useReducers/index.d.ts +0 -4
  33. package/es/hooks/useReducers/index.js +0 -13
  34. package/es/methods/initEntityReducers/index.d.ts +0 -5
  35. package/es/methods/initEntityReducers/index.js +0 -11
  36. package/lib/hooks/useEntityReducers/index.js +0 -30
  37. package/lib/hooks/useReducers/index.js +0 -20
  38. package/lib/methods/initEntityReducers/index.js +0 -24
@@ -14,9 +14,10 @@ var _usecases = require("@mic-rexjs/usecases");
14
14
  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; }
15
15
  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; }
16
16
  var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function () {
17
- var keyIndex = 0;
18
17
  return function () {
19
- var prevKeyIndex = keyIndex++;
18
+ var _utilsUseCase = (0, _usecases.utilsUseCase)(),
19
+ createKey = _utilsUseCase.createKey;
20
+ var prevKeyIndex = createKey();
20
21
  var entityReducers = (0, _usecases.entityUseCase)();
21
22
  var hasField = function hasField(entity, field) {
22
23
  if ((0, _typeof2["default"])(entity) !== 'object' || entity === null) {
@@ -27,7 +28,7 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
27
28
  var isValueChanged = function isValueChanged(entity, value) {
28
29
  return entity !== value;
29
30
  };
30
- var isValueMatched = function isValueMatched(entity, value) {
31
+ var isValueMatched = function isValueMatched(entity, value, onMatchFailed) {
31
32
  if (entity === value) {
32
33
  return true;
33
34
  }
@@ -36,23 +37,39 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
36
37
  if (!isObject1 || !isObject2) {
37
38
  return false;
38
39
  }
40
+ var allMatched = true;
39
41
  var keys1 = Object.keys(entity);
40
42
  var keys2 = Object.keys(value);
41
43
  var length1 = keys1.length;
42
- var length2 = keys2.length;
43
- if (length1 !== length2) {
44
- return false;
45
- }
46
- for (var _i = 0, _keys = keys1; _i < _keys.length; _i++) {
47
- var key = _keys[_i];
44
+ var keys = [].concat(keys1, keys2);
45
+ var hasCallback = typeof onMatchFailed === 'function';
46
+ for (var i = 0, length = keys.length; i < length; i++) {
47
+ var key = keys[i];
48
+ var isFromKeys2 = i >= length1;
49
+ var isInKey1 = keys1.includes(key);
50
+ var isUsed = isFromKeys2 && isInKey1;
51
+ if (isUsed) {
52
+ continue;
53
+ }
54
+ var hasField1 = Object.hasOwn(entity, key);
55
+ var hasField2 = Object.hasOwn(value, key);
56
+ var onlyHasField1 = hasField1 && !hasField2;
57
+ var onlyHasField2 = !hasField1 && hasField2;
58
+ var onlyHasOneField = onlyHasField1 || onlyHasField2;
48
59
  var value1 = entity[key];
49
60
  var value2 = value[key];
50
- if (value1 === value2) {
61
+ var matched = value1 === value2;
62
+ if (!onlyHasOneField && matched) {
51
63
  continue;
52
64
  }
53
- return false;
65
+ allMatched = false;
66
+ if (hasCallback) {
67
+ onMatchFailed(key, value2, value1);
68
+ continue;
69
+ }
70
+ break;
54
71
  }
55
- return true;
72
+ return allMatched;
56
73
  };
57
74
  var matchProperty = function matchProperty(entity, value, fieldPath, onFailed) {
58
75
  var allMatched = true;
@@ -141,56 +158,83 @@ var valueUseCase = exports.valueUseCase = (0, _usecases.createUseCase)(function
141
158
  }
142
159
  }, recordValue);
143
160
  });
144
- var recordValueMatch = /*#__PURE__*/_regenerator["default"].mark(function recordValueMatch(entity, value) {
145
- var matched;
161
+ var recordValueDiff = /*#__PURE__*/_regenerator["default"].mark(function recordValueDiff(entity, value) {
162
+ var isArray1, isArray2, isArray, result, length1, length2, matched;
146
163
  return _regenerator["default"].wrap(function (_context2) {
147
164
  while (1) switch (_context2.prev = _context2.next) {
165
+ case 0:
166
+ isArray1 = Array.isArray(entity);
167
+ isArray2 = Array.isArray(value);
168
+ isArray = isArray1 && isArray2;
169
+ result = isArray ? [] : {};
170
+ if (isArray) {
171
+ length1 = entity.length;
172
+ length2 = value.length;
173
+ result.length = Math.max(length1, length2);
174
+ }
175
+ matched = isValueMatched(entity, value, function (key, newValue) {
176
+ result[key] = newValue;
177
+ });
178
+ if (matched) {
179
+ _context2.next = 1;
180
+ break;
181
+ }
182
+ _context2.next = 1;
183
+ return value;
184
+ case 1:
185
+ return _context2.abrupt("return", result);
186
+ case 2:
187
+ case "end":
188
+ return _context2.stop();
189
+ }
190
+ }, recordValueDiff);
191
+ });
192
+ var recordValueMatch = /*#__PURE__*/_regenerator["default"].mark(function recordValueMatch(entity, value) {
193
+ var matched;
194
+ return _regenerator["default"].wrap(function (_context3) {
195
+ while (1) switch (_context3.prev = _context3.next) {
148
196
  case 0:
149
197
  matched = isValueMatched(entity, value);
150
198
  if (!matched) {
151
- _context2.next = 1;
199
+ _context3.next = 1;
152
200
  break;
153
201
  }
154
- return _context2.abrupt("return", true);
202
+ return _context3.abrupt("return", true);
155
203
  case 1:
156
- _context2.next = 2;
204
+ _context3.next = 2;
157
205
  return value;
158
206
  case 2:
159
- return _context2.abrupt("return", false);
207
+ return _context3.abrupt("return", false);
160
208
  case 3:
161
209
  case "end":
162
- return _context2.stop();
210
+ return _context3.stop();
163
211
  }
164
212
  }, recordValueMatch);
165
213
  });
166
- var recordValueMatchWith = function recordValueMatchWith(entity, value) {
167
- var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : keyIndex + 1;
168
- return /*#__PURE__*/_regenerator["default"].mark(function _callee() {
169
- var matched;
170
- return _regenerator["default"].wrap(function (_context3) {
171
- while (1) switch (_context3.prev = _context3.next) {
172
- case 0:
173
- return _context3.delegateYield(recordValueMatch(entity, value), "t0", 1);
174
- case 1:
175
- matched = _context3.t0;
176
- if (!matched) {
177
- // 不管是不是使用 `keyIndex` 生成的 `key`,都自增一次,如果是,则可以保持一致
178
- keyIndex++;
179
- prevKeyIndex = key;
180
- }
181
- return _context3.abrupt("return", prevKeyIndex);
182
- case 2:
183
- case "end":
184
- return _context3.stop();
185
- }
186
- }, _callee);
187
- })();
188
- };
214
+ var recordValueMatchWith = /*#__PURE__*/_regenerator["default"].mark(function recordValueMatchWith(entity, value, key) {
215
+ var matched;
216
+ return _regenerator["default"].wrap(function (_context4) {
217
+ while (1) switch (_context4.prev = _context4.next) {
218
+ case 0:
219
+ return _context4.delegateYield(recordValueMatch(entity, value), "t0", 1);
220
+ case 1:
221
+ matched = _context4.t0;
222
+ if (!matched) {
223
+ prevKeyIndex = key !== null && key !== void 0 ? key : createKey();
224
+ }
225
+ return _context4.abrupt("return", prevKeyIndex);
226
+ case 2:
227
+ case "end":
228
+ return _context4.stop();
229
+ }
230
+ }, recordValueMatchWith);
231
+ });
189
232
  return _objectSpread(_objectSpread({}, entityReducers), {}, {
190
233
  isValueChanged: isValueChanged,
191
234
  isValueMatched: isValueMatched,
192
235
  matchProperty: matchProperty,
193
236
  recordValue: recordValue,
237
+ recordValueDiff: recordValueDiff,
194
238
  recordValueMatch: recordValueMatch,
195
239
  recordValueMatchWith: recordValueMatchWith
196
240
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mic-rexjs/usecases-react",
3
- "version": "2.10.3",
3
+ "version": "2.11.1",
4
4
  "description": "React-based solution for use usecases of Clean Architecture",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -54,7 +54,7 @@
54
54
  "@eslint/js": "^10.0.1",
55
55
  "@ianvs/prettier-plugin-sort-imports": "^4.7.1",
56
56
  "@jest/globals": "^30.3.0",
57
- "@mic-rexjs/usecases": "^2.14.2",
57
+ "@mic-rexjs/usecases": "^2.15.1",
58
58
  "@testing-library/dom": "^10.4.1",
59
59
  "@testing-library/react": "^16.3.2",
60
60
  "@types/node": "^25.6.0",
@@ -1,4 +0,0 @@
1
- import { CreateEntityReducersOptions, ScopedEntityReducers } from '@mic-rexjs/usecases/es/methods/createEntityReducers/types';
2
- import { EntityReducerMap, EntityReducers, InferableEntityUseCase } from '@mic-rexjs/usecases/es/types';
3
- import { Dependencies } from '../../types';
4
- export declare const useEntityReducers: <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(initailEntity: T, usecase: InferableEntityUseCase<T, TEntityReducers & EntityReducers<T>, TUseCaseOptions>, options?: CreateEntityReducersOptions<T, TUseCaseOptions>, deps?: Dependencies) => ScopedEntityReducers<T, EntityReducers<T, TEntityReducers>>;
@@ -1,18 +0,0 @@
1
- import { useConstant } from '../useConstant';
2
- import { createEntityReducers } from '@mic-rexjs/usecases';
3
- import { useCreation, useMemoizedFn } from 'ahooks';
4
- import { valueUseCase } from '../../usecases/valueUseCase';
5
- export const useEntityReducers = (initailEntity, usecase, options, deps = []) => {
6
- const { recordValueMatchWith } = useConstant(() => {
7
- return createEntityReducers(deps, valueUseCase);
8
- });
9
- const [, depsKey] = recordValueMatchWith(deps);
10
- const onCreate = useMemoizedFn(() => {
11
- return createEntityReducers(initailEntity, usecase, options);
12
- });
13
- return useCreation(() => {
14
- void depsKey;
15
- void usecase;
16
- return onCreate();
17
- }, [depsKey, usecase, onCreate]);
18
- };
@@ -1,4 +0,0 @@
1
- import { NonEntitySymbolSet } from '../useUseCase/types';
2
- import { ReducerMap, SymbolSetTarget, UseCase } from '@mic-rexjs/usecases/es/types';
3
- import { Dependencies } from '../../types';
4
- export declare const useReducers: <T extends ReducerMap, TUseCaseOptions extends object = object>(usecase: UseCase<T & SymbolSetTarget<NonEntitySymbolSet>, TUseCaseOptions>, options?: TUseCaseOptions, deps?: Dependencies) => T;
@@ -1,13 +0,0 @@
1
- import { useDepsKey } from '../useDepsKey';
2
- import { useCreation, useMemoizedFn } from 'ahooks';
3
- export const useReducers = (usecase, options, deps = []) => {
4
- const depsKey = useDepsKey(deps);
5
- const onCreate = useMemoizedFn(() => {
6
- return usecase(options);
7
- });
8
- return useCreation(() => {
9
- void depsKey;
10
- void usecase;
11
- return onCreate();
12
- }, [depsKey, usecase, onCreate]);
13
- };
@@ -1,5 +0,0 @@
1
- import { UseCaseHookOptions } from '../../hooks/useUseCase/types';
2
- import { EntityStore } from '@mic-rexjs/usecases';
3
- import { EntityReducerMap, InferableEntityUseCase } from '@mic-rexjs/usecases/es/types';
4
- import { ContextualEntityReducers } from '../../usecases/contextUseCase/types';
5
- export declare const initEntityReducers: <T, TEntityReducers extends EntityReducerMap<T>, TUseCaseOptions extends object = object>(usecase: InferableEntityUseCase<T, TEntityReducers, TUseCaseOptions>, store: EntityStore<T>, options: UseCaseHookOptions<T, TUseCaseOptions>) => ContextualEntityReducers<T, TEntityReducers>;
@@ -1,11 +0,0 @@
1
- import { createEntityReducers } from '@mic-rexjs/usecases';
2
- export const initEntityReducers = (usecase, store, options) => {
3
- const { watch, onChange, options: usecaseOptions, ...restUseCaseOptions } = options;
4
- return createEntityReducers(store, usecase, {
5
- ...restUseCaseOptions,
6
- ...usecaseOptions,
7
- onGenerate(newEntity, result) {
8
- return result;
9
- },
10
- });
11
- };
@@ -1,30 +0,0 @@
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
- };
@@ -1,20 +0,0 @@
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
- };
@@ -1,24 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.initEntityReducers = void 0;
8
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
- var _usecases = require("@mic-rexjs/usecases");
11
- var _excluded = ["watch", "onChange", "options"];
12
- 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; }
13
- 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; }
14
- var initEntityReducers = exports.initEntityReducers = function initEntityReducers(usecase, store, options) {
15
- var watch = options.watch,
16
- onChange = options.onChange,
17
- usecaseOptions = options.options,
18
- restUseCaseOptions = (0, _objectWithoutProperties2["default"])(options, _excluded);
19
- return (0, _usecases.createEntityReducers)(store, usecase, _objectSpread(_objectSpread(_objectSpread({}, restUseCaseOptions), usecaseOptions), {}, {
20
- onGenerate: function onGenerate(newEntity, result) {
21
- return result;
22
- }
23
- }));
24
- };