@mic-rexjs/usecases-react 1.3.32

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 (46) hide show
  1. package/README.md +187 -0
  2. package/dist/index.min.js +2 -0
  3. package/dist/index.min.js.LICENSE.txt +9 -0
  4. package/es/components/UseCaseFragment/index.d.ts +3 -0
  5. package/es/components/UseCaseFragment/index.js +7 -0
  6. package/es/components/UseCaseFragment/types.d.ts +7 -0
  7. package/es/components/UseCaseFragment/types.js +1 -0
  8. package/es/configs/defaultUseCaseContext/index.d.ts +2 -0
  9. package/es/configs/defaultUseCaseContext/index.js +2 -0
  10. package/es/configs/usecaseContextMap/index.d.ts +3 -0
  11. package/es/configs/usecaseContextMap/index.js +1 -0
  12. package/es/configs/usecaseContextMap/types.d.ts +20 -0
  13. package/es/configs/usecaseContextMap/types.js +1 -0
  14. package/es/core/usecases/optionsGetterCellectionUseCase/index.d.ts +2 -0
  15. package/es/core/usecases/optionsGetterCellectionUseCase/index.js +13 -0
  16. package/es/core/usecases/optionsGetterCellectionUseCase/types.d.ts +8 -0
  17. package/es/core/usecases/optionsGetterCellectionUseCase/types.js +1 -0
  18. package/es/hooks/useOptionsTransfer/index.d.ts +3 -0
  19. package/es/hooks/useOptionsTransfer/index.js +15 -0
  20. package/es/hooks/useUseCase/index.d.ts +2 -0
  21. package/es/hooks/useUseCase/index.js +99 -0
  22. package/es/hooks/useUseCase/index.test.d.ts +1 -0
  23. package/es/hooks/useUseCase/index.test.js +670 -0
  24. package/es/hooks/useUseCase/methods/triggerCallbacks/index.d.ts +3 -0
  25. package/es/hooks/useUseCase/methods/triggerCallbacks/index.js +11 -0
  26. package/es/hooks/useUseCase/methods/triggerWatchers/index.d.ts +2 -0
  27. package/es/hooks/useUseCase/methods/triggerWatchers/index.js +10 -0
  28. package/es/hooks/useUseCase/types.d.ts +25 -0
  29. package/es/hooks/useUseCase/types.js +1 -0
  30. package/es/index.d.ts +2 -0
  31. package/es/index.js +2 -0
  32. package/lib/components/UseCaseFragment/index.js +20 -0
  33. package/lib/components/UseCaseFragment/types.js +5 -0
  34. package/lib/configs/defaultUseCaseContext/index.js +9 -0
  35. package/lib/configs/usecaseContextMap/index.js +8 -0
  36. package/lib/configs/usecaseContextMap/types.js +5 -0
  37. package/lib/core/usecases/optionsGetterCellectionUseCase/index.js +23 -0
  38. package/lib/core/usecases/optionsGetterCellectionUseCase/types.js +5 -0
  39. package/lib/hooks/useOptionsTransfer/index.js +23 -0
  40. package/lib/hooks/useUseCase/index.js +135 -0
  41. package/lib/hooks/useUseCase/index.test.js +951 -0
  42. package/lib/hooks/useUseCase/methods/triggerCallbacks/index.js +32 -0
  43. package/lib/hooks/useUseCase/methods/triggerWatchers/index.js +22 -0
  44. package/lib/hooks/useUseCase/types.js +5 -0
  45. package/lib/index.js +27 -0
  46. package/package.json +84 -0
@@ -0,0 +1,10 @@
1
+ export const triggerWatchers = (watch, newEntity, prevEntity) => {
2
+ for (const [property, watcher] of Object.entries(watch)) {
3
+ const newValue = newEntity?.[property];
4
+ const prevValue = prevEntity?.[property];
5
+ if (newValue === prevValue) {
6
+ continue;
7
+ }
8
+ watcher(newEntity, prevEntity);
9
+ }
10
+ };
@@ -0,0 +1,25 @@
1
+ import { EntityReducers, EntityUseCase, Reducers, UseCase } from '@mic-rexjs/usecases';
2
+ import { UseCaseContext, UseCaseContextWithProvider } from '../../configs/usecaseContextMap/types';
3
+ export interface EntityGetter<T> {
4
+ (): T;
5
+ }
6
+ export interface EntityWatcher<T> {
7
+ (newEntity: T, prevEntity: T): void;
8
+ }
9
+ export type EntityWatchMap<T> = T extends unknown[] ? Record<number, EntityWatcher<T>> : T extends object ? {
10
+ [K in keyof T]?: EntityWatcher<T>;
11
+ } : object;
12
+ export interface UseCaseHookContextualOptions<T> {
13
+ watch?: EntityWatchMap<T>;
14
+ onChange?(newEntity: T, prevEntity: T): void;
15
+ }
16
+ export interface UseCaseHookOwnOptions<T, TOptions extends object> extends UseCaseHookContextualOptions<T> {
17
+ stateless?: boolean;
18
+ options?: TOptions;
19
+ }
20
+ export type UseCaseHookOptions<T, TOptions extends object> = TOptions & UseCaseHookOwnOptions<T, TOptions>;
21
+ export interface UseCaseHook {
22
+ <T, TReducers extends EntityReducers<T>, TOptions extends UseCaseHookContextualOptions<T> = UseCaseHookContextualOptions<T>>(usecase: EntityUseCase<T, TReducers & EntityReducers<T>>, options?: TOptions): UseCaseContext<T, TReducers>;
23
+ <T, TReducers extends EntityReducers<T>, TUseCaseOptions extends object = object, TOptions extends UseCaseHookOptions<T, TUseCaseOptions> = UseCaseHookOptions<T, TUseCaseOptions>>(defaultEntity: T | EntityGetter<T>, usecase: EntityUseCase<T, TReducers, TUseCaseOptions> & UseCase<TReducers, TUseCaseOptions>, options?: TOptions, deps?: unknown[]): UseCaseContextWithProvider<T, TReducers>;
24
+ <T extends Reducers, TOptions extends object = object>(usecase: UseCase<T, TOptions>, options?: TOptions, deps?: unknown[]): T;
25
+ }
@@ -0,0 +1 @@
1
+ export {};
package/es/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './components/UseCaseFragment';
2
+ export * from './hooks/useUseCase';
package/es/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from './components/UseCaseFragment';
2
+ export * from './hooks/useUseCase';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.UseCaseFragment = void 0;
7
+ var _jsxRuntime = require("react/jsx-runtime");
8
+ var _react = require("react");
9
+ var _useUseCase = require("../../hooks/useUseCase");
10
+ var UseCaseFragment = function UseCaseFragment(_ref) {
11
+ var usecase = _ref.usecase,
12
+ watch = _ref.watch,
13
+ onChange = _ref.onChange;
14
+ void (0, _useUseCase.useUseCase)(usecase, {
15
+ watch: watch,
16
+ onChange: onChange
17
+ });
18
+ return (0, _jsxRuntime.jsx)(_react.Fragment, {});
19
+ };
20
+ exports.UseCaseFragment = UseCaseFragment;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.defaultUseCaseContext = void 0;
7
+ var _react = require("react");
8
+ var defaultUseCaseContext = (0, _react.createContext)(null);
9
+ exports.defaultUseCaseContext = defaultUseCaseContext;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.usecaseContextMap = void 0;
7
+ var usecaseContextMap = new Map();
8
+ exports.usecaseContextMap = usecaseContextMap;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.optionsGetterCollectionUseCase = void 0;
7
+ var optionsGetterCollectionUseCase = function optionsGetterCollectionUseCase(collection) {
8
+ var addOptionsGetter = function addOptionsGetter(getter) {
9
+ collection.unshift(getter);
10
+ };
11
+ var removeOptionsGetter = function removeOptionsGetter(getter) {
12
+ var index = collection.indexOf(getter);
13
+ if (index === -1) {
14
+ return;
15
+ }
16
+ collection.splice(index, 1);
17
+ };
18
+ return {
19
+ addOptionsGetter: addOptionsGetter,
20
+ removeOptionsGetter: removeOptionsGetter
21
+ };
22
+ };
23
+ exports.optionsGetterCollectionUseCase = optionsGetterCollectionUseCase;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useOptionsTransfer = void 0;
7
+ var _ahooks = require("ahooks");
8
+ var useOptionsTransfer = function useOptionsTransfer(options, optionsGetterListReducers) {
9
+ var addOptionsGetter = optionsGetterListReducers.addOptionsGetter,
10
+ removeOptionsGetter = optionsGetterListReducers.removeOptionsGetter;
11
+ var prevRemoveOptionsGetter = (0, _ahooks.usePrevious)(removeOptionsGetter);
12
+ var getOptions = (0, _ahooks.useMemoizedFn)(function () {
13
+ return options;
14
+ });
15
+ (0, _ahooks.useCreation)(function () {
16
+ prevRemoveOptionsGetter === null || prevRemoveOptionsGetter === void 0 ? void 0 : prevRemoveOptionsGetter(getOptions);
17
+ addOptionsGetter(getOptions);
18
+ }, [addOptionsGetter, prevRemoveOptionsGetter, getOptions]);
19
+ (0, _ahooks.useUnmount)(function () {
20
+ removeOptionsGetter(getOptions);
21
+ });
22
+ };
23
+ exports.useOptionsTransfer = useOptionsTransfer;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useUseCase = void 0;
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _ahooks = require("ahooks");
14
+ var _react = _interopRequireWildcard(require("react"));
15
+ var _defaultUseCaseContext = require("../../configs/defaultUseCaseContext");
16
+ var _usecaseContextMap = require("../../configs/usecaseContextMap");
17
+ var _optionsGetterCellectionUseCase = require("../../core/usecases/optionsGetterCellectionUseCase");
18
+ var _triggerCallbacks = require("./methods/triggerCallbacks");
19
+ var _useOptionsTransfer = require("../useOptionsTransfer");
20
+ var _usecases = require("@mic-rexjs/usecases");
21
+ var _excluded = ["stateless", "watch", "onChange", "options"];
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
26
+ var useUseCase = function useUseCase(arg1, arg2, arg3, arg4) {
27
+ var _useState = (0, _react.useState)(typeof arg2 === 'function'),
28
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 1),
29
+ hasDefaultEntity = _useState2[0];
30
+ var _useState3 = (0, _react.useState)(hasDefaultEntity ? arg1 : null),
31
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
32
+ entityState = _useState4[0],
33
+ setEntityState = _useState4[1];
34
+ var options = (hasDefaultEntity ? arg3 : arg2) || {};
35
+ var stateless = options.stateless,
36
+ watch = options.watch,
37
+ onChange = options.onChange,
38
+ usecaseOptions = options.options,
39
+ restUseCaseOptions = (0, _objectWithoutProperties2["default"])(options, _excluded);
40
+ var optionsGetterListRef = (0, _react.useRef)([]);
41
+ var deps = (hasDefaultEntity ? arg4 : arg3) || [];
42
+ var _useState5 = (0, _react.useState)(function () {
43
+ return hasDefaultEntity ? arg2 : arg1;
44
+ }),
45
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 1),
46
+ usecase = _useState6[0];
47
+ var _useState7 = (0, _react.useState)(function () {
48
+ var map = _usecaseContextMap.usecaseContextMap;
49
+ var entityUseCase = usecase;
50
+ if (map.has(entityUseCase)) {
51
+ return map.get(entityUseCase);
52
+ }
53
+ if (!hasDefaultEntity) {
54
+ return _defaultUseCaseContext.defaultUseCaseContext;
55
+ }
56
+ var ctx = (0, _react.createContext)(null);
57
+ map.set(entityUseCase, ctx);
58
+ return ctx;
59
+ }),
60
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 1),
61
+ context = _useState8[0];
62
+ var _ref = (0, _react.useContext)(context) || [],
63
+ _ref2 = (0, _slicedToArray2["default"])(_ref, 3),
64
+ contextEntity = _ref2[0],
65
+ contextEntityReducers = _ref2[1],
66
+ contextCollectionReducers = _ref2[2];
67
+ var entity = (0, _react.useMemo)(function () {
68
+ if (!hasDefaultEntity) {
69
+ return contextEntity;
70
+ }
71
+ if (!stateless) {
72
+ return entityState;
73
+ }
74
+ if (typeof arg1 !== 'function') {
75
+ return arg1;
76
+ }
77
+ return arg1();
78
+ }, [hasDefaultEntity, contextEntity, stateless, entityState, arg1]);
79
+ var initReducers = (0, _ahooks.useMemoizedFn)(function () {
80
+ var mergedOptions = _objectSpread(_objectSpread({}, restUseCaseOptions), usecaseOptions);
81
+ if (!hasDefaultEntity) {
82
+ return contextEntityReducers || usecase(mergedOptions);
83
+ }
84
+ var _entityReducerUseCase = (0, _usecases.entityReducerUseCase)(),
85
+ createEntityReducers = _entityReducerUseCase.createEntityReducers;
86
+ return createEntityReducers(entity, usecase, _objectSpread(_objectSpread({}, mergedOptions), {}, {
87
+ onChange: function onChange(newEntity, prevEntity) {
88
+ if (hasDefaultEntity && !stateless) {
89
+ setEntityState(newEntity);
90
+ }
91
+ (0, _triggerCallbacks.triggerCallbacks)(optionsGetterListRef.current, newEntity, prevEntity);
92
+ },
93
+ onGenerate: function onGenerate(newEntity, result) {
94
+ return result;
95
+ }
96
+ }));
97
+ });
98
+ var reducers = _react.useMemo.call(null, initReducers, [entity, initReducers].concat((0, _toConsumableArray2["default"])(deps)));
99
+ var collectionReducers = (0, _react.useMemo)(function () {
100
+ if (!hasDefaultEntity && contextCollectionReducers) {
101
+ return contextCollectionReducers;
102
+ }
103
+ return (0, _optionsGetterCellectionUseCase.optionsGetterCollectionUseCase)(optionsGetterListRef.current);
104
+ }, [hasDefaultEntity, contextCollectionReducers]);
105
+ var contextValueWithCollectionReducers = (0, _react.useMemo)(function () {
106
+ return [entity, reducers, collectionReducers];
107
+ }, [entity, reducers, collectionReducers]);
108
+ var contextValueWithCollectionReducersRef = (0, _ahooks.useLatest)(contextValueWithCollectionReducers);
109
+ var _useState9 = (0, _react.useState)(function () {
110
+ return function (_ref3) {
111
+ var children = _ref3.children;
112
+ var ContextProvider = context.Provider;
113
+ return _react["default"].createElement(ContextProvider, {
114
+ value: contextValueWithCollectionReducersRef.current
115
+ }, children);
116
+ };
117
+ }),
118
+ _useState10 = (0, _slicedToArray2["default"])(_useState9, 1),
119
+ Provider = _useState10[0];
120
+ var contextValue = (0, _react.useMemo)(function () {
121
+ if (hasDefaultEntity) {
122
+ return [entity, reducers, Provider];
123
+ }
124
+ return [entity, reducers];
125
+ }, [entity, reducers, hasDefaultEntity, Provider]);
126
+ var result = (0, _react.useMemo)(function () {
127
+ if (context === _defaultUseCaseContext.defaultUseCaseContext) {
128
+ return reducers;
129
+ }
130
+ return contextValue;
131
+ }, [context, reducers, contextValue]);
132
+ void (0, _useOptionsTransfer.useOptionsTransfer)(options, collectionReducers);
133
+ return result;
134
+ };
135
+ exports.useUseCase = useUseCase;