@mic-rexjs/usecases-react 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/es/configs/useCaseContextReferenceMap/index.d.ts +1 -0
- package/es/configs/useCaseContextReferenceMap/index.js +1 -0
- package/es/configs/useCaseContextReferenceMap/types.d.ts +8 -0
- package/es/hooks/useUseCaseContext/index.d.ts +2 -2
- package/es/hooks/useUseCaseContext/index.js +34 -5
- package/es/hooks/useUseCaseContext/index.test.d.ts +1 -0
- package/es/hooks/useUseCaseContext/index.test.js +60 -0
- package/es/methods/initEntityReducers/index.js +1 -2
- package/lib/configs/useCaseContextReferenceMap/index.js +8 -0
- package/lib/hooks/useUseCaseContext/index.js +36 -5
- package/lib/hooks/useUseCaseContext/index.test.js +75 -0
- package/lib/methods/initEntityReducers/index.js +1 -3
- package/package.json +3 -3
- package/es/configs/usecaseContextMap/index.d.ts +0 -1
- package/es/configs/usecaseContextMap/index.js +0 -1
- package/es/configs/usecaseContextMap/types.d.ts +0 -4
- package/lib/configs/usecaseContextMap/index.js +0 -8
- /package/es/configs/{usecaseContextMap → useCaseContextReferenceMap}/types.js +0 -0
- /package/lib/configs/{usecaseContextMap → useCaseContextReferenceMap}/types.js +0 -0
package/dist/index.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see index.min.js.LICENSE.txt */
|
|
2
|
-
!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("react"),require("ahooks"),require("@mic-rexjs/usecases"));else if("function"==typeof define&&define.amd)define(["react","ahooks","@mic-rexjs/usecases"],r);else{var t="object"==typeof exports?r(require("react"),require("ahooks"),require("@mic-rexjs/usecases")):r(e.react,e.ahooks,e["@mic-rexjs/usecases"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,((e,r,t)=>(()=>{"use strict";var n={251:(e,r,t)=>{var n=t(156),o=Symbol.for("react.element"),u=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),a=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};r.jsx=function(e,r,t){var n,c={},l=null,f=null;for(n in void 0!==t&&(l=""+t),void 0!==r.key&&(l=""+r.key),void 0!==r.ref&&(f=r.ref),r)u.call(r,n)&&!i.hasOwnProperty(n)&&(c[n]=r[n]);if(e&&e.defaultProps)for(n in r=e.defaultProps)void 0===c[n]&&(c[n]=r[n]);return{$$typeof:o,type:e,key:l,ref:f,props:c,_owner:a.current}}},
|
|
2
|
+
!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("react"),require("ahooks"),require("@mic-rexjs/usecases"));else if("function"==typeof define&&define.amd)define(["react","ahooks","@mic-rexjs/usecases"],r);else{var t="object"==typeof exports?r(require("react"),require("ahooks"),require("@mic-rexjs/usecases")):r(e.react,e.ahooks,e["@mic-rexjs/usecases"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,((e,r,t)=>(()=>{"use strict";var n={251:(e,r,t)=>{var n=t(156),o=Symbol.for("react.element"),u=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),a=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};r.jsx=function(e,r,t){var n,c={},l=null,f=null;for(n in void 0!==t&&(l=""+t),void 0!==r.key&&(l=""+r.key),void 0!==r.ref&&(f=r.ref),r)u.call(r,n)&&!i.hasOwnProperty(n)&&(c[n]=r[n]);if(e&&e.defaultProps)for(n in r=e.defaultProps)void 0===c[n]&&(c[n]=r[n]);return{$$typeof:o,type:e,key:l,ref:f,props:c,_owner:a.current}}},521:(e,r,t)=>{e.exports=t(251)},112:e=>{e.exports=t},749:e=>{e.exports=r},156:r=>{r.exports=e}},o={};function u(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return n[e](t,t.exports,u),t.exports}u.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return u.d(r,{a:r}),r},u.d=(e,r)=>{for(var t in r)u.o(r,t)&&!u.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},u.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),u.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};return(()=>{u.r(a),u.d(a,{UseCaseFragment:()=>E,useGlobalUseCase:()=>k,useStatelessUseCase:()=>M,useUseCase:()=>A});var e=u(521),r=u(156),t=u.n(r);function n(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}function o(e,r){if(e){if("string"==typeof e)return n(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(e,r):void 0}}function i(e,r){return function(e){if(Array.isArray(e))return e}(e)||function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,o,u,a,i=[],c=!0,l=!1;try{if(u=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;c=!1}else for(;!(c=(n=u.call(t)).done)&&(i.push(n.value),i.length!==r);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=t.return&&(a=t.return(),Object(a)!==a))return}finally{if(l)throw o}}return i}}(e,r)||o(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var c,l=u(749),f=function(e){return i((0,r.useState)(e),1)[0]},s=function(e){return i((0,r.useState)((function(){return e})),1)[0]};!function(e){e[e.Normal=2]="Normal",e[e.Stateless=4]="Stateless",e[e.Global=8]="Global",e[e.StatelessGlobal=12]="StatelessGlobal"}(c||(c={}));var y=function(e,r){var t=e.length;if(t!==r.length)return!1;for(var n=0;n<t;n++)if(e[n]!==r[n])return!1;return!0},v=function(e){var t=(0,r.useRef)(0),n=(0,r.useRef)([]),o=n.current,u=y(e,o);return n.current=e,t.current+=u?0:1,t.current};function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function b(e,r,t){return(r=function(e){var r=function(e,r){if("object"!==p(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==p(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===p(r)?r:String(r)}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var m=u(112),d=["watch","onChange","options"];function h(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function g(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?h(Object(t),!0).forEach((function(r){b(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):h(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var O=new Map,j=(0,r.createContext)(null),S=function(e,r){for(var t={},n={},o=function(){var e=i(a[u],2),o=e[0],c=e[1];n[o]=function(){for(var e=t[o],n=r(),u=arguments.length,a=new Array(u),i=0;i<u;i++)a[i]=arguments[i];if(e&&n){var l=e.parameters,f=e.returnValue;if(y(l,a))return f}var s=c.apply(void 0,a);return n&&(t[o]={parameters:a,returnValue:s}),s}},u=0,a=Object.entries(e);u<a.length;u++)o();return n},w=function(e,r){var t=e.indexOf(r);-1!==t&&e.splice(t,1)};function C(e){return function(e){if(Array.isArray(e))return n(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||o(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var x=function(e,r){return"object"===p(e)&&null!==e&&Object.hasOwn(e,r)},P=function e(r,t,n,o){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],a=void 0,c=i(n.match(/^([^.]+)\.(.+)$/)||[],3),l=c[1],f=void 0===l?n:l,s=c[2],y=void 0===s?"":s,v=x(r,f),p=x(t,f),b=[].concat(C(u),[f]);if(v||p){var m=v?r[f]:a,d=p?t[f]:a;if(y)return void e(m,d,y,o,b);if(m===d)return;o(m,d,b)}else if(!/^\d+^/.test(f))for(var h=Array.isArray(r)?r:[],g=Array.isArray(t)?t:[],O=h.length,j=g.length,S=Math.max(O,j),w=0;w<S;w++)e(h[w],g[w],n,o,[].concat(C(u),["".concat(w)]))},_=function(e,r,t){for(var n=function(){var e=i(u[o],2),n=e[0],a=e[1];P(t,r,n,(function(e,n,o){a({fieldPaths:o,newEntity:r,oldEntity:t,newValue:n,oldValue:e})}))},o=0,u=Object.entries(e);o<u.length;o++)n()},A=function(){for(var e=arguments.length,n=new Array(e),o=0;o<e;o++)n[o]=arguments[o];var u,a=function(e){var r=i(e,5),t=r[0],n=r[1],o=r[2],u=r[3],a=r[4];return"function"!=typeof n?[null,t,c.Normal,n||{},o||[]]:"number"==typeof o?[t,n,o,u||{},a||[]]:[t,n,c.Normal,o||{},u||[]]}(n),y=i(a,5),p=y[0],b=y[1],h=y[2],C=y[3],x=y[4],P=i((0,r.useState)(p),2),A=P[0],E=P[1],k=s(b),M=k,R=f(h),G=v(x),I=((u=(0,r.useRef)(!0)).current=!0,(0,r.useEffect)((function(){u.current=!1})),u),U=f("function"==typeof n[1]),F=function(e,t){var n=O,o=f((function(){if(n.has(e)){var o=n.get(e),u=o.value,a=o.times;return n.set(e,{value:u,times:a+1}),u}if(t)return t;var i=(0,r.createContext)(null);return n.set(e,{value:i,times:1}),i}));return(0,l.useUnmount)((function(){if(n.has(e)){var r=n.get(e),t=r.value,u=r.times;o===t&&(1!==u?n.set(e,{value:t,times:u-1}):n.delete(e))}})),o}(M,U?null:j),T=(0,r.useContext)(F),N=null!==T,q=(null==T?void 0:T())||{},D=q.entity,z=q.reducers,L=void 0===z?null:z,V=q.changeCallbackCollection,$=U||N,B=function(e,r,t){var n=(0,l.useCreation)((function(){return e?[]:r}),[r,e]),o=(0,l.useMemoizedFn)((function(e,r){var n=t.onChange,o=t.watch;o&&_(o,e,r),null==n||n(e,r)})),u=(0,l.usePrevious)(n);return(0,l.useCreation)((function(){u&&w(u,o),n.push(o)}),[o,n,u]),(0,l.useUnmount)((function(){w(n,o)})),n}(U||!N,void 0===V?null:V,C),W=(0,l.useCreation)((function(){return U?function(e,r,t){return(t&c.Stateless)!==c.Stateless?e:"function"==typeof r?r():r}(A,p,R):D}),[U,D,R,A,p]),Y=(0,l.useMemoizedFn)((function(e,r){(R&c.Stateless)!==c.Stateless&&E(e),function(e,r,t){for(var n=e.length;n>0;n--)e[n-1](r,t)}(B,e,r)})),H=(0,l.useMemoizedFn)((function(){return function(e,r,t,n){t.watch,t.onChange;var o=t.options,u=function(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},u=Object.keys(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}(t,d);return(0,m.createEntityReducers)(e,r,g(g(g({},u),o),{},{onChange:n,onGenerate:function(e,r){return r}}))}(W,M,C,Y)})),J=(0,l.useMemoizedFn)((function(){return k(C)})),K=(0,l.useCreation)((function(){return U?H():null}),[U,G,H]),Q=(0,l.useCreation)((function(){return K||L||{}}),[K,L]),X=(0,l.useCreation)((function(){return $?{}:J()}),[$,G,J]),Z=function(e,n,o,u,a){var i=(n&c.Global)===c.Global,f=(0,l.useLatest)({entity:o,reducers:u,changeCallbackCollection:a}),y=v(i?[]:[o,u,a]),p=(0,r.useCallback)((function(){return f.current}),[y,f]),b=(0,l.useLatest)(p);return s((function(r){var n=r.children,o=r.with,u=void 0===o?[]:o,a=e.Provider;return t().createElement(a,{value:b.current},u.reduceRight((function(e,r){return t().createElement(r,{},e)}),n))}))}(F,R,W,Q,B),ee=(0,l.useMemoizedFn)((function(e,r){return[e,S(r,(function(){return I.current})),U?Z:null]}));return(0,l.useCreation)((function(){return $?ee(W,Q):X}),[$,W,Q,X,ee])},E=function(t){var n=t.usecase,o=t.watch,u=t.onChange;return A(n,{watch:o,onChange:u}),(0,e.jsx)(r.Fragment,{})},k=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var n=r[0],o=r[1],u=r.slice(2),a="function"==typeof o,i=A.apply(void 0,C(a?[n,o,c.Global].concat(C(u)):r));return a?i:i[1]},M=function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var n=r[0],o=r[1],u=r.slice(2),a="function"==typeof o;return A.apply(void 0,C(a?[n,o,c.Stateless].concat(C(u)):r))}})(),a})()));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const usecaseContextReferenceMap: Map<any, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const usecaseContextReferenceMap = new Map();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
|
|
2
|
+
import { UseCaseContext } from '../defaultUseCaseContext/types';
|
|
3
|
+
export interface UseCaseContextReference<T, TEntityReducers extends EntityReducers<T>, TContext extends UseCaseContext<T, TEntityReducers> = UseCaseContext<T, TEntityReducers>> {
|
|
4
|
+
value: TContext;
|
|
5
|
+
times: number;
|
|
6
|
+
}
|
|
7
|
+
export interface UseCaseContextReferenceMap<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object, TContext extends UseCaseContext<T, TEntityReducers> = UseCaseContext<T, TEntityReducers>> extends Map<EntityUseCase<T, TEntityReducers, TUseCaseOptions>, UseCaseContextReference<T, TEntityReducers, TContext>> {
|
|
8
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
|
|
1
|
+
import { EntityReducers, EntityUseCase, UseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { UseCaseContext } from '../../configs/defaultUseCaseContext/types';
|
|
3
|
-
export declare const useUseCaseContext: <T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object, TContext extends UseCaseContext<T, TEntityReducers> = UseCaseContext<T, TEntityReducers>>(usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions>, defaultContext?: TContext | null | undefined) => TContext;
|
|
3
|
+
export declare const useUseCaseContext: <T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object, TContext extends UseCaseContext<T, TEntityReducers> = UseCaseContext<T, TEntityReducers>>(usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions> & UseCase<EntityReducers<T>, TUseCaseOptions>, defaultContext?: (TContext & UseCaseContext<T, TEntityReducers>) | null | undefined) => TContext;
|
|
@@ -1,17 +1,46 @@
|
|
|
1
1
|
import { useConstant } from '../useConstant';
|
|
2
|
-
import {
|
|
2
|
+
import { usecaseContextReferenceMap } from '../../configs/useCaseContextReferenceMap';
|
|
3
3
|
import { createContext } from 'react';
|
|
4
|
+
import { useUnmount } from 'ahooks';
|
|
4
5
|
export const useUseCaseContext = (usecase, defaultContext) => {
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
const map = usecaseContextReferenceMap;
|
|
7
|
+
const context = useConstant(() => {
|
|
7
8
|
if (map.has(usecase)) {
|
|
8
|
-
|
|
9
|
+
const reference = map.get(usecase);
|
|
10
|
+
const { value, times } = reference;
|
|
11
|
+
map.set(usecase, {
|
|
12
|
+
value,
|
|
13
|
+
times: times + 1,
|
|
14
|
+
});
|
|
15
|
+
return value;
|
|
9
16
|
}
|
|
10
17
|
if (defaultContext) {
|
|
11
18
|
return defaultContext;
|
|
12
19
|
}
|
|
13
20
|
const ctx = createContext(null);
|
|
14
|
-
map.set(usecase,
|
|
21
|
+
map.set(usecase, {
|
|
22
|
+
value: ctx,
|
|
23
|
+
times: 1,
|
|
24
|
+
});
|
|
15
25
|
return ctx;
|
|
16
26
|
});
|
|
27
|
+
useUnmount(() => {
|
|
28
|
+
if (!map.has(usecase)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const reference = map.get(usecase);
|
|
32
|
+
const { value, times } = reference;
|
|
33
|
+
if (context !== value) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (times === 1) {
|
|
37
|
+
map.delete(usecase);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
map.set(usecase, {
|
|
41
|
+
value,
|
|
42
|
+
times: times - 1,
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
return context;
|
|
17
46
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, test } from '@jest/globals';
|
|
2
|
+
import { renderHook } from '@testing-library/react';
|
|
3
|
+
import { useUseCaseContext } from '.';
|
|
4
|
+
import { objectUseCase } from '@mic-rexjs/usecases';
|
|
5
|
+
import { defaultUseCaseContext } from '../../configs/defaultUseCaseContext';
|
|
6
|
+
import { usecaseContextReferenceMap } from '../../configs/useCaseContextReferenceMap';
|
|
7
|
+
const testUseCase = () => {
|
|
8
|
+
return objectUseCase();
|
|
9
|
+
};
|
|
10
|
+
describe('useUseCaseContext', () => {
|
|
11
|
+
test('should return the default context if map has not save a usecase and provide a default context', () => {
|
|
12
|
+
const defaultContext = defaultUseCaseContext;
|
|
13
|
+
const { result } = renderHook(() => {
|
|
14
|
+
return useUseCaseContext(testUseCase, defaultContext);
|
|
15
|
+
});
|
|
16
|
+
const { current } = result;
|
|
17
|
+
expect(current).toBe(defaultUseCaseContext);
|
|
18
|
+
});
|
|
19
|
+
test('should return a new context if map has not save a usecase and does not provide a default context', () => {
|
|
20
|
+
const { result } = renderHook(() => {
|
|
21
|
+
return useUseCaseContext(testUseCase, null);
|
|
22
|
+
});
|
|
23
|
+
const { current } = result;
|
|
24
|
+
expect(typeof current).toBe('object');
|
|
25
|
+
});
|
|
26
|
+
test.each([void 0, null, defaultUseCaseContext])('should return the existing context if map has save a usecase already', (defaultContext) => {
|
|
27
|
+
const { result } = renderHook(() => {
|
|
28
|
+
return useUseCaseContext(testUseCase) === useUseCaseContext(testUseCase, defaultContext);
|
|
29
|
+
});
|
|
30
|
+
const { current: isSame } = result;
|
|
31
|
+
expect(isSame).toBe(true);
|
|
32
|
+
});
|
|
33
|
+
test('check context reference times when mount/unmount a usecase', () => {
|
|
34
|
+
const { unmount: unmount1 } = renderHook(() => {
|
|
35
|
+
useUseCaseContext(testUseCase);
|
|
36
|
+
});
|
|
37
|
+
const { times: times1 } = usecaseContextReferenceMap.get(testUseCase);
|
|
38
|
+
const { unmount: unmount2, rerender: rerender2 } = renderHook(() => {
|
|
39
|
+
useUseCaseContext(testUseCase);
|
|
40
|
+
useUseCaseContext(testUseCase);
|
|
41
|
+
});
|
|
42
|
+
const { times: times2 } = usecaseContextReferenceMap.get(testUseCase);
|
|
43
|
+
expect(times1).toBe(1);
|
|
44
|
+
expect(times2).toBe(3);
|
|
45
|
+
unmount1();
|
|
46
|
+
const { times: times3 } = usecaseContextReferenceMap.get(testUseCase);
|
|
47
|
+
expect(times3).toBe(2);
|
|
48
|
+
unmount2();
|
|
49
|
+
const hasSaved = usecaseContextReferenceMap.has(testUseCase);
|
|
50
|
+
expect(hasSaved).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
test('context reference times should not change when rerender hooks', () => {
|
|
53
|
+
const { rerender } = renderHook(() => {
|
|
54
|
+
useUseCaseContext(testUseCase);
|
|
55
|
+
});
|
|
56
|
+
rerender();
|
|
57
|
+
const { times } = usecaseContextReferenceMap.get(testUseCase);
|
|
58
|
+
expect(times).toBe(1);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createEntityReducers } from '@mic-rexjs/usecases';
|
|
2
2
|
export const initEntityReducers = (entity, usecase, options, onEntityChange) => {
|
|
3
|
-
const { createEntityReducers } = entityReducerUseCase();
|
|
4
3
|
const { watch, onChange, options: usecaseOptions, ...restUseCaseOptions } = options;
|
|
5
4
|
return createEntityReducers(entity, usecase, {
|
|
6
5
|
...restUseCaseOptions,
|
|
@@ -5,20 +5,51 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useUseCaseContext = void 0;
|
|
7
7
|
var _useConstant = require("../useConstant");
|
|
8
|
-
var
|
|
8
|
+
var _useCaseContextReferenceMap = require("../../configs/useCaseContextReferenceMap");
|
|
9
9
|
var _react = require("react");
|
|
10
|
+
var _ahooks = require("ahooks");
|
|
10
11
|
var useUseCaseContext = function useUseCaseContext(usecase, defaultContext) {
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
var map = _useCaseContextReferenceMap.usecaseContextReferenceMap;
|
|
13
|
+
var context = (0, _useConstant.useConstant)(function () {
|
|
13
14
|
if (map.has(usecase)) {
|
|
14
|
-
|
|
15
|
+
var reference = map.get(usecase);
|
|
16
|
+
var value = reference.value,
|
|
17
|
+
times = reference.times;
|
|
18
|
+
map.set(usecase, {
|
|
19
|
+
value: value,
|
|
20
|
+
times: times + 1
|
|
21
|
+
});
|
|
22
|
+
return value;
|
|
15
23
|
}
|
|
16
24
|
if (defaultContext) {
|
|
17
25
|
return defaultContext;
|
|
18
26
|
}
|
|
19
27
|
var ctx = (0, _react.createContext)(null);
|
|
20
|
-
map.set(usecase,
|
|
28
|
+
map.set(usecase, {
|
|
29
|
+
value: ctx,
|
|
30
|
+
times: 1
|
|
31
|
+
});
|
|
21
32
|
return ctx;
|
|
22
33
|
});
|
|
34
|
+
(0, _ahooks.useUnmount)(function () {
|
|
35
|
+
if (!map.has(usecase)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
var reference = map.get(usecase);
|
|
39
|
+
var value = reference.value,
|
|
40
|
+
times = reference.times;
|
|
41
|
+
if (context !== value) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (times === 1) {
|
|
45
|
+
map["delete"](usecase);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
map.set(usecase, {
|
|
49
|
+
value: value,
|
|
50
|
+
times: times - 1
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
return context;
|
|
23
54
|
};
|
|
24
55
|
exports.useUseCaseContext = useUseCaseContext;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
5
|
+
var _globals = require("@jest/globals");
|
|
6
|
+
var _react = require("@testing-library/react");
|
|
7
|
+
var _ = require(".");
|
|
8
|
+
var _usecases = require("@mic-rexjs/usecases");
|
|
9
|
+
var _defaultUseCaseContext = require("../../configs/defaultUseCaseContext");
|
|
10
|
+
var _useCaseContextReferenceMap = require("../../configs/useCaseContextReferenceMap");
|
|
11
|
+
var testUseCase = function testUseCase() {
|
|
12
|
+
return (0, _usecases.objectUseCase)();
|
|
13
|
+
};
|
|
14
|
+
(0, _globals.describe)('useUseCaseContext', function () {
|
|
15
|
+
(0, _globals.test)('should return the default context if map has not save a usecase and provide a default context', function () {
|
|
16
|
+
var defaultContext = _defaultUseCaseContext.defaultUseCaseContext;
|
|
17
|
+
var _renderHook = (0, _react.renderHook)(function () {
|
|
18
|
+
return (0, _.useUseCaseContext)(testUseCase, defaultContext);
|
|
19
|
+
}),
|
|
20
|
+
result = _renderHook.result;
|
|
21
|
+
var current = result.current;
|
|
22
|
+
(0, _globals.expect)(current).toBe(_defaultUseCaseContext.defaultUseCaseContext);
|
|
23
|
+
});
|
|
24
|
+
(0, _globals.test)('should return a new context if map has not save a usecase and does not provide a default context', function () {
|
|
25
|
+
var _renderHook2 = (0, _react.renderHook)(function () {
|
|
26
|
+
return (0, _.useUseCaseContext)(testUseCase, null);
|
|
27
|
+
}),
|
|
28
|
+
result = _renderHook2.result;
|
|
29
|
+
var current = result.current;
|
|
30
|
+
(0, _globals.expect)((0, _typeof2["default"])(current)).toBe('object');
|
|
31
|
+
});
|
|
32
|
+
_globals.test.each([void 0, null, _defaultUseCaseContext.defaultUseCaseContext])('should return the existing context if map has save a usecase already', function (defaultContext) {
|
|
33
|
+
var _renderHook3 = (0, _react.renderHook)(function () {
|
|
34
|
+
return (0, _.useUseCaseContext)(testUseCase) === (0, _.useUseCaseContext)(testUseCase, defaultContext);
|
|
35
|
+
}),
|
|
36
|
+
result = _renderHook3.result;
|
|
37
|
+
var isSame = result.current;
|
|
38
|
+
(0, _globals.expect)(isSame).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
(0, _globals.test)('check context reference times when mount/unmount a usecase', function () {
|
|
41
|
+
var _renderHook4 = (0, _react.renderHook)(function () {
|
|
42
|
+
(0, _.useUseCaseContext)(testUseCase);
|
|
43
|
+
}),
|
|
44
|
+
unmount1 = _renderHook4.unmount;
|
|
45
|
+
var _usecaseContextRefere = _useCaseContextReferenceMap.usecaseContextReferenceMap.get(testUseCase),
|
|
46
|
+
times1 = _usecaseContextRefere.times;
|
|
47
|
+
var _renderHook5 = (0, _react.renderHook)(function () {
|
|
48
|
+
(0, _.useUseCaseContext)(testUseCase);
|
|
49
|
+
(0, _.useUseCaseContext)(testUseCase);
|
|
50
|
+
}),
|
|
51
|
+
unmount2 = _renderHook5.unmount,
|
|
52
|
+
rerender2 = _renderHook5.rerender;
|
|
53
|
+
var _usecaseContextRefere2 = _useCaseContextReferenceMap.usecaseContextReferenceMap.get(testUseCase),
|
|
54
|
+
times2 = _usecaseContextRefere2.times;
|
|
55
|
+
(0, _globals.expect)(times1).toBe(1);
|
|
56
|
+
(0, _globals.expect)(times2).toBe(3);
|
|
57
|
+
unmount1();
|
|
58
|
+
var _usecaseContextRefere3 = _useCaseContextReferenceMap.usecaseContextReferenceMap.get(testUseCase),
|
|
59
|
+
times3 = _usecaseContextRefere3.times;
|
|
60
|
+
(0, _globals.expect)(times3).toBe(2);
|
|
61
|
+
unmount2();
|
|
62
|
+
var hasSaved = _useCaseContextReferenceMap.usecaseContextReferenceMap.has(testUseCase);
|
|
63
|
+
(0, _globals.expect)(hasSaved).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
(0, _globals.test)('context reference times should not change when rerender hooks', function () {
|
|
66
|
+
var _renderHook6 = (0, _react.renderHook)(function () {
|
|
67
|
+
(0, _.useUseCaseContext)(testUseCase);
|
|
68
|
+
}),
|
|
69
|
+
rerender = _renderHook6.rerender;
|
|
70
|
+
rerender();
|
|
71
|
+
var _usecaseContextRefere4 = _useCaseContextReferenceMap.usecaseContextReferenceMap.get(testUseCase),
|
|
72
|
+
times = _usecaseContextRefere4.times;
|
|
73
|
+
(0, _globals.expect)(times).toBe(1);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -12,13 +12,11 @@ var _excluded = ["watch", "onChange", "options"];
|
|
|
12
12
|
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; }
|
|
13
13
|
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; }
|
|
14
14
|
var initEntityReducers = function initEntityReducers(entity, usecase, options, onEntityChange) {
|
|
15
|
-
var _entityReducerUseCase = (0, _usecases.entityReducerUseCase)(),
|
|
16
|
-
createEntityReducers = _entityReducerUseCase.createEntityReducers;
|
|
17
15
|
var watch = options.watch,
|
|
18
16
|
onChange = options.onChange,
|
|
19
17
|
usecaseOptions = options.options,
|
|
20
18
|
restUseCaseOptions = (0, _objectWithoutProperties2["default"])(options, _excluded);
|
|
21
|
-
return createEntityReducers(entity, usecase, _objectSpread(_objectSpread(_objectSpread({}, restUseCaseOptions), usecaseOptions), {}, {
|
|
19
|
+
return (0, _usecases.createEntityReducers)(entity, usecase, _objectSpread(_objectSpread(_objectSpread({}, restUseCaseOptions), usecaseOptions), {}, {
|
|
22
20
|
onChange: onEntityChange,
|
|
23
21
|
onGenerate: function onGenerate(newEntity, result) {
|
|
24
22
|
return result;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mic-rexjs/usecases-react",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "React-based solution for use usecases of Clean Architecture",
|
|
5
5
|
"private": false,
|
|
6
6
|
"keywords": [
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
},
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"@mic-rexjs/usecases": "^
|
|
36
|
+
"@mic-rexjs/usecases": "^2.0.0",
|
|
37
37
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"@babel/preset-typescript": "^7.22.5",
|
|
49
49
|
"@commitlint/cli": "^17.6.6",
|
|
50
50
|
"@commitlint/config-angular": "^17.6.6",
|
|
51
|
-
"@mic-rexjs/usecases": "^1.4.29",
|
|
52
51
|
"@jest/globals": "^29.5.0",
|
|
52
|
+
"@mic-rexjs/usecases": "^2.0.0",
|
|
53
53
|
"@testing-library/react": "^14.0.0",
|
|
54
54
|
"@types/node": "^20.4.2",
|
|
55
55
|
"@types/react": "^18.2.14",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const usecaseContextMap: Map<any, any>;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const usecaseContextMap = new Map();
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
|
|
2
|
-
import { UseCaseContext } from '../defaultUseCaseContext/types';
|
|
3
|
-
export interface UseCaseContextMap<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object> extends Map<EntityUseCase<T, TEntityReducers, TUseCaseOptions>, UseCaseContext<T, TEntityReducers>> {
|
|
4
|
-
}
|
|
File without changes
|
|
File without changes
|