@mic-rexjs/usecases-react 2.1.3 → 2.2.0
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/components/UseCaseFragment/index.d.ts +2 -2
- package/es/components/UseCaseFragment/types.d.ts +3 -3
- package/es/configs/defaultUseCaseContext/index.d.ts +3 -1
- package/es/configs/defaultUseCaseContext/types.d.ts +7 -5
- package/es/configs/useCaseContextReferenceMap/types.d.ts +2 -2
- package/es/hooks/useArgumentTypes/index.js +2 -5
- package/es/hooks/useContextualItem/index.d.ts +1 -1
- package/es/hooks/useContextualItem/index.js +1 -1
- package/es/hooks/useEntity/index.js +5 -6
- package/es/hooks/useGlobalUseCase/index.js +2 -2
- package/es/hooks/useGlobalUseCase/index.test.js +23 -7
- package/es/hooks/useGlobalUseCase/types.d.ts +2 -4
- package/es/hooks/useProvider/index.d.ts +2 -2
- package/es/hooks/useProvider/index.js +2 -1
- package/es/hooks/useUseCase/index.js +10 -12
- package/es/hooks/useUseCase/index.test.js +68 -105
- package/es/hooks/useUseCase/types.d.ts +19 -45
- package/es/hooks/useUseCaseContext/index.d.ts +2 -3
- package/es/hooks/useUseCaseContext/index.js +3 -8
- package/es/hooks/useUseCaseContext/index.test.js +2 -30
- package/es/hooks/useUseCaseStatuses/index.d.ts +2 -2
- package/es/hooks/useUseCaseStatuses/index.js +3 -3
- package/es/index.d.ts +1 -1
- package/es/methods/fillArguments/index.d.ts +2 -2
- package/es/methods/fillArguments/index.js +0 -9
- package/es/methods/fillArguments/types.d.ts +3 -3
- package/es/methods/initEntityReducers/index.d.ts +2 -2
- package/lib/hooks/useArgumentTypes/index.js +2 -5
- package/lib/hooks/useContextualItem/index.js +1 -1
- package/lib/hooks/useEntity/index.js +5 -8
- package/lib/hooks/useGlobalUseCase/index.js +2 -2
- package/lib/hooks/useGlobalUseCase/index.test.js +18 -7
- package/lib/hooks/useProvider/index.js +4 -2
- package/lib/hooks/useUseCase/index.js +12 -12
- package/lib/hooks/useUseCase/index.test.js +147 -182
- package/lib/hooks/useUseCaseContext/index.js +2 -8
- package/lib/hooks/useUseCaseContext/index.test.js +8 -36
- package/lib/hooks/useUseCaseStatuses/index.js +3 -3
- package/lib/methods/fillArguments/index.js +0 -3
- package/package.json +3 -3
- package/es/enums/UseCaseModeErrors/index.d.ts +0 -4
- package/es/enums/UseCaseModeErrors/index.js +0 -5
- package/es/hooks/useSafeMode/index.d.ts +0 -3
- package/es/hooks/useSafeMode/index.js +0 -18
- package/lib/enums/UseCaseModeErrors/index.js +0 -11
- package/lib/hooks/useSafeMode/index.js +0 -24
package/dist/index.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see index.min.js.LICENSE.txt */
|
|
2
|
-
(()=>{var e={20:(e,t,n)=>{"use strict";var r=n(594),o=Symbol.for("react.element"),a=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),u=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};t.jsx=function(e,t,n){var r,l={},s=null,c=null;for(r in void 0!==n&&(s=""+n),void 0!==t.key&&(s=""+t.key),void 0!==t.ref&&(c=t.ref),t)a.call(t,r)&&!i.hasOwnProperty(r)&&(l[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===l[r]&&(l[r]=t[r]);return{$$typeof:o,type:e,key:s,ref:c,props:l,_owner:u.current}}},848:(e,t,n)=>{"use strict";e.exports=n(20)},594:e=>{"use strict";e.exports=React}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{UseCaseFragment:()=>A,useGlobalUseCase:()=>N,useStatelessUseCase:()=>M,useUseCase:()=>G});var e=n(848),t=n(594),o=n.n(t);function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function u(e,t){if(e){if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(e,t):void 0}}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,u,i=[],l=!0,s=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);l=!0);}catch(e){s=!0,o=e}finally{try{if(!l&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(s)throw o}}return i}}(e,t)||u(e,t)||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.")}()}const l=ahooks;var s,c=function(e){return i((0,t.useState)((function(){return e})),1)[0]};function f(e){return f="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},f(e)}function b(e){var t=function(e,t){if("object"!=f(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,"string");if("object"!=f(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==f(t)?t:String(t)}!function(e){e[e.None=0]="None",e[e.RootEnabled=2]="RootEnabled",e[e.ContextEnabled=4]="ContextEnabled",e[e.EntityEnabled=8]="EntityEnabled",e[e.ContextRootEnabled=22]="ContextRootEnabled",e[e.EntityRootEnabled=62]="EntityRootEnabled",e[e.StatelessEnabled=72]="StatelessEnabled",e[e.GlobalEnabled=150]="GlobalEnabled"}(s||(s={}));const d=usecases;var y=["watch","onChange","options"];function v(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function E(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?v(Object(n),!0).forEach((function(t){var r,o,a;r=e,o=t,a=n[t],(o=b(o))in r?Object.defineProperty(r,o,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[o]=a})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var p,m,h=function(e){return i((0,t.useState)(e),1)[0]},S=new Map;!function(e){e[e.None=0]="None",e[e.Entity=2]="Entity",e[e.Mode=4]="Mode"}(p||(p={})),function(e){e[e.Normal=2]="Normal",e[e.Stateless=4]="Stateless",e[e.Global=8]="Global",e[e.StatelessGlobal=12]="StatelessGlobal"}(m||(m={}));var g=(0,t.createContext)(null),O=function(e,t){var n=e.length;if(n!==t.length)return!1;for(var r=0;r<n;r++)if(e[r]!==t[r])return!1;return!0},w=function(e,t){var n,r=t||{},o=r.onShouldCache,a=void 0===o?function(){return!0}:o,u=r.onCompare,i=void 0===u?function(e,t){return O(e,t)}:u;return function(){for(var t=a(),r=arguments.length,o=new Array(r),u=0;u<r;u++)o[u]=arguments[u];if(n&&t){var l=n,s=l.parameters,c=l.returnValue;if(i(s,o))return c}var f=e.apply(void 0,o);return t&&(n={parameters:o,returnValue:f}),f}},j=function(e,n,r){var o,a,u,i=(o=r,a=function(e){var n=(0,t.useRef)(0),r=(0,t.useRef)([]),o=r.current,a=O(e,o);return r.current=e,n.current+=a?0:1,n.current}(arguments.length>3&&void 0!==arguments[3]?arguments[3]:[]),u=(0,l.useLatest)(o),(0,l.useCreation)((function(){return w(u.current,{onCompare:function(){return!0}})}),[a,u]));return(0,l.useCreation)((function(){return(e&s.RootEnabled)!==s.RootEnabled&&n?n:i()}),[e,n,i])};function C(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||u(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 R,P=function(e,t){return"object"===f(e)&&null!==e&&Object.hasOwn(e,t)},_=function e(t,n,r,o){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],u=void 0,l=i(r.match(/^([^.]+)\.(.+)$/)||[],3),s=l[1],c=void 0===s?r:s,f=l[2],b=void 0===f?"":f,d=P(t,c),y=P(n,c),v=[].concat(C(a),[c]);if(d||y){var E=d?t[c]:u,p=y?n[c]:u;if(b)return void e(E,p,b,o,v);if(E===p)return;o(E,p,v)}else if(!/^\d+^/.test(c))for(var m=Array.isArray(t)?t:[],h=Array.isArray(n)?n:[],S=m.length,g=h.length,O=Math.max(S,g),w=0;w<O;w++)e(m[w],h[w],r,o,[].concat(C(a),["".concat(w)]))},x=function(e,t,n){for(var r=function(){var e=i(a[o],2),r=e[0],u=e[1];_(n,t,r,(function(e,r,o){u({fieldPaths:o,newEntity:t,oldEntity:n,newValue:r,oldValue:e})}))},o=0,a=Object.entries(e);o<a.length;o++)r()};!function(e){e.UnsupportedGlobal='useUseCase does not support "global" mode with entity usecase',e.UnsupportedStateless='useUseCase does not support "stateless" mode with non-entity usecase'}(R||(R={}));var G=function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];var a,u=function(e){return h((function(){var t=p.None,n=i(e,3),r=n[1],o=n[2],a=f(r);switch("function"===a&&(t|=p.Entity),"number"){case a:case f(o):t|=p.Mode}return t}))}(n),b=function(e,t){var n=i(e,5),r=n[0],o=n[1],a=n[2],u=n[3],l=n[4],s=(t&p.Entity)===p.Entity,c=(t&p.Mode)===p.Mode;return s?c?[r,o,a,u||{},l||[]]:[r,o,m.Normal,a||{},u||[]]:c?[null,r,o,a||{},u||[]]:[null,r,m.Normal,o||{},a||[]]}(n,u),v=i(b,5),O=v[0],C=v[1],P=v[2],_=v[3],G=v[4],A=c(C),N=A,M=A,U=((a=(0,t.useRef)(!0)).current=!0,(0,t.useEffect)((function(){a.current=!1})),a),I=function(e,t){return h((function(){if((t&p.Entity)===p.Entity){if((e&m.Global)===m.Global)throw R.UnsupportedGlobal;return e}if((e&m.Stateless)===m.Stateless)throw R.UnsupportedStateless;return e}))}(P,u),k=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p.None,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:m.Normal,o=S,a=h((function(){if(o.has(e)){var a=o.get(e),u=a.value,i=a.times;return o.set(e,{value:u,times:i+1}),u}switch(!0){case(r&m.Global)===m.Global:case(n&p.Entity)===p.Entity:break;default:return g}var l=(0,t.createContext)(null);return o.set(e,{value:l,times:1}),l}));return(0,l.useUnmount)((function(){if(o.has(e)){var t=o.get(e),n=t.value,r=t.times;a===n&&(1!==r?o.set(e,{value:n,times:r-1}):o.delete(e))}})),a}(A,u,I),L=(0,t.useContext)(k),T=L,D=function(e,t,n){return(0,l.useCreation)((function(){var r=s.None,o=(n||{}).store;return(e&p.Entity)===p.Entity&&(r|=s.EntityRootEnabled),r|=null===n?s.RootEnabled:s.ContextEnabled,o&&(r|=s.EntityEnabled),(t&m.Stateless)===m.Stateless&&(r|=s.StatelessEnabled),(t&m.Global)===m.Global&&(r|=s.GlobalEnabled),r}),[e,n,t])}(u,I,L),V=(L||{}).reducers,$=void 0===V?null:V,F=(T||{}).store,B=i(function(e,n,r,o){var a=i((0,t.useState)(n),2),u=a[0],c=a[1],f=r?r.value:null,b=function(e,t,n,r){return(e&s.EntityRootEnabled)!==s.EntityRootEnabled?r:(e&s.StatelessEnabled)!==s.StatelessEnabled?t:"function"==typeof n?n():n}(e,u,n,f),y=(0,l.useLatest)(o),v=(e&s.EntityRootEnabled)===s.EntityRootEnabled,E=j(e,r,(function(){if(!v)return new d.EntityStore(null);var t=(e&s.StatelessEnabled)===s.StatelessEnabled;return new d.EntityStore(b,{onChange:function(e){var n=e.newEntity;t||c(n)}})}));return v&&(E.value=b),(0,t.useEffect)((function(){if((e&s.EntityEnabled)===s.EntityEnabled){var t=function(e){var t=e.newEntity,n=e.oldEntity,r=y.current,o=r.onChange,a=r.watch;a&&x(a,t,n),null==o||o(t,n)};return E.addEventListener("change",t),function(){E.removeEventListener("change",t)}}}),[e,E,y]),(0,l.useCreation)((function(){return[b,E]}),[b,E])}(D,O,void 0===F?null:F,_),2),W=B[0],Y=B[1],q=j(D,$,(function(){return(D&s.EntityEnabled)!==s.EntityEnabled?N(_):function(e,t,n){n.watch,n.onChange;var r=n.options,o=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(n,y);return(0,d.createEntityReducers)(t,e,E(E(E({},o),r),{},{onGenerate:function(e,t){return t}}))}(M,Y,_)}),G),z=function(e,n,r,a){var u=r.value,i=(0,t.useMemo)((function(){return(e&s.EntityEnabled)===s.EntityEnabled?{store:r,reducers:a}:{reducers:a}}),[e,u,r,a]),f=(0,l.useLatest)(i);return c((function(e){var t=e.children,r=e.with,a=void 0===r?[]:r,u=n.Provider;return o().createElement(u,{value:f.current},a.reduceRight((function(e,t){return o().createElement(t,{},e)}),t))}))}(D,k,Y,q);return(0,l.useCreation)((function(){if((D&s.ContextEnabled)!==s.ContextEnabled)return q;var e=(D&s.RootEnabled)===s.RootEnabled;if((D&s.EntityEnabled)!==s.EntityEnabled)return e?[q,z]:q;var t=function(e,t){var n={};return Object.entries(e).forEach((function(e){var r=i(e,2),o=r[0],a=r[1];n[o]=w(a,t)})),n}(q,{onShouldCache:function(){return U.current}});return e?[W,t,z]:[W,t]}),[D,W,q,z,U])},A=function(n){var r=n.usecase,o=n.watch,a=n.onChange;return G(r,{watch:o,onChange:a}),(0,e.jsx)(t.Fragment,{})},N=function(e,t,n){return G(e,m.Global,t,n)},M=function(e,t,n,r){return G(e,t,m.Stateless,n,r)}})();var o=usecases="undefined"==typeof usecases?{}:usecases;for(var a in r)o[a]=r[a];r.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})();
|
|
2
|
+
(()=>{var t={20:(t,e,n)=>{"use strict";var r=n(594),o=Symbol.for("react.element"),a=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),u=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};e.jsx=function(t,e,n){var r,l={},c=null,s=null;for(r in void 0!==n&&(c=""+n),void 0!==e.key&&(c=""+e.key),void 0!==e.ref&&(s=e.ref),e)a.call(e,r)&&!i.hasOwnProperty(r)&&(l[r]=e[r]);if(t&&t.defaultProps)for(r in e=t.defaultProps)void 0===l[r]&&(l[r]=e[r]);return{$$typeof:o,type:t,key:c,ref:s,props:l,_owner:u.current}}},848:(t,e,n)=>{"use strict";t.exports=n(20)},594:t=>{"use strict";t.exports=React}},e={};function n(r){var o=e[r];if(void 0!==o)return o.exports;var a=e[r]={exports:{}};return t[r](a,a.exports,n),a.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{UseCaseFragment:()=>A,useGlobalUseCase:()=>N,useStatelessUseCase:()=>G,useUseCase:()=>x});var t=n(848),e=n(594),o=n.n(e);function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function u(t,e){if(t){if("string"==typeof t)return a(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?a(t,e):void 0}}function i(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,o,a,u,i=[],l=!0,c=!1;try{if(a=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(i.push(r.value),i.length!==e);l=!0);}catch(t){c=!0,o=t}finally{try{if(!l&&null!=n.return&&(u=n.return(),Object(u)!==u))return}finally{if(c)throw o}}return i}}(t,e)||u(t,e)||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.")}()}const l=ahooks;var c,s=function(t){return i((0,e.useState)((function(){return t})),1)[0]};function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function b(t){var e=function(t,e){if("object"!=f(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!=f(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==f(e)?e:String(e)}!function(t){t[t.None=0]="None",t[t.RootEnabled=2]="RootEnabled",t[t.ContextEnabled=4]="ContextEnabled",t[t.EntityEnabled=8]="EntityEnabled",t[t.ContextRootEnabled=22]="ContextRootEnabled",t[t.EntityRootEnabled=62]="EntityRootEnabled",t[t.StatelessEnabled=72]="StatelessEnabled",t[t.GlobalEnabled=150]="GlobalEnabled"}(c||(c={}));const y=usecases;var d=["watch","onChange","options"];function v(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function E(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?v(Object(n),!0).forEach((function(e){var r,o,a;r=t,o=e,a=n[e],(o=b(o))in r?Object.defineProperty(r,o,{value:a,enumerable:!0,configurable:!0,writable:!0}):r[o]=a})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):v(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}var p,m=function(t){return i((0,e.useState)(t),1)[0]},h=new Map;!function(t){t[t.None=0]="None",t[t.Entity=2]="Entity",t[t.Mode=4]="Mode"}(p||(p={}));var S,g=(0,e.createContext)(null);!function(t){t[t.Normal=2]="Normal",t[t.Stateless=4]="Stateless",t[t.Global=8]="Global",t[t.StatelessGlobal=12]="StatelessGlobal"}(S||(S={}));var O=function(t,e){var n=t.length;if(n!==e.length)return!1;for(var r=0;r<n;r++)if(t[r]!==e[r])return!1;return!0},w=function(t,e){var n,r=e||{},o=r.onShouldCache,a=void 0===o?function(){return!0}:o,u=r.onCompare,i=void 0===u?function(t,e){return O(t,e)}:u;return function(){for(var e=a(),r=arguments.length,o=new Array(r),u=0;u<r;u++)o[u]=arguments[u];if(n&&e){var l=n,c=l.parameters,s=l.returnValue;if(i(c,o))return s}var f=t.apply(void 0,o);return e&&(n={parameters:o,returnValue:f}),f}},j=function(t,n,r){var o,a,u,i=(o=r,a=function(t){var n=(0,e.useRef)(0),r=(0,e.useRef)([]),o=r.current,a=O(t,o);return r.current=t,n.current+=a?0:1,n.current}(arguments.length>3&&void 0!==arguments[3]?arguments[3]:[]),u=(0,l.useLatest)(o),(0,l.useCreation)((function(){return w(u.current,{onCompare:function(){return!0}})}),[a,u]));return(0,l.useCreation)((function(){return(n&c.RootEnabled)!==c.RootEnabled&&t?t:i()}),[n,t,i])};function C(t){return function(t){if(Array.isArray(t))return a(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||u(t)||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 R=function(t,e){return"object"===f(t)&&null!==t&&Object.hasOwn(t,e)},P=function t(e,n,r,o){var a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],u=void 0,l=i(r.match(/^([^.]+)\.(.+)$/)||[],3),c=l[1],s=void 0===c?r:c,f=l[2],b=void 0===f?"":f,y=R(e,s),d=R(n,s),v=[].concat(C(a),[s]);if(y||d){var E=y?e[s]:u,p=d?n[s]:u;if(b)return void t(E,p,b,o,v);if(E===p)return;o(E,p,v)}else if(!/^\d+^/.test(s))for(var m=Array.isArray(e)?e:[],h=Array.isArray(n)?n:[],S=m.length,g=h.length,O=Math.max(S,g),w=0;w<O;w++)t(m[w],h[w],r,o,[].concat(C(a),["".concat(w)]))},_=function(t,e,n){for(var r=function(){var t=i(a[o],2),r=t[0],u=t[1];P(n,e,r,(function(t,r,o){u({fieldPaths:o,newEntity:e,oldEntity:n,newValue:r,oldValue:t})}))},o=0,a=Object.entries(t);o<a.length;o++)r()},x=function(){for(var t,n=((t=(0,e.useRef)(!0)).current=!0,(0,e.useEffect)((function(){t.current=!1})),t),r=arguments.length,a=new Array(r),u=0;u<r;u++)a[u]=arguments[u];var b=function(t){return m((function(){var e=p.None,n=i(t,3),r=n[1],o=n[2];return"function"===f(r)&&(e|=p.Entity,"number"==typeof o&&(e|=p.Mode)),e}))}(a),v=function(t,e){var n=i(t,5),r=n[0],o=n[1],a=n[2],u=n[3],l=n[4],c=(e&p.Entity)===p.Entity,s=(e&p.Mode)===p.Mode;return c?s?[r,o,a,u||{},l||[]]:[r,o,S.Normal,a||{},u||[]]:[null,r,S.Normal,o||{},a||[]]}(a,b),O=i(v,5),C=O[0],R=O[1],P=O[2],x=O[3],A=O[4],N=s(R),G=N,M=N,I=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p.None,r=h,o=m((function(){if(r.has(t)){var o=r.get(t),a=o.value,u=o.times;return r.set(t,{value:a,times:u+1}),a}if((n&p.Entity)!==p.Entity)return g;var i=(0,e.createContext)(null);return r.set(t,{value:i,times:1}),i}));return(0,l.useUnmount)((function(){if(r.has(t)){var e=r.get(t),n=e.value,a=e.times;o===n&&(1!==a?r.set(t,{value:n,times:a-1}):r.delete(t))}})),o}(N,b),T=(0,e.useContext)(I),U=T,k=function(t,e,n){return(0,l.useCreation)((function(){var r=c.None,o=(n||{}).store;return(t&p.Entity)===p.Entity&&(r|=c.EntityRootEnabled),r|=n?c.ContextEnabled:c.RootEnabled,o&&(r|=c.EntityEnabled),(e&S.Stateless)===S.Stateless&&(r|=c.StatelessEnabled),(e&S.Global)===S.Global&&(r|=c.GlobalEnabled),r}),[t,n,e])}(b,P,T),D=T||{},L=D.reducers,V=void 0===L?null:L,$=D.statuses,F=void 0===$?c.None:$,B=(U||{}).store,W=i(function(t,n,r,o){var a=i((0,e.useState)(n),2),u=a[0],s=a[1],f=r?r.value:null,b=function(t,e,n,r){return(t&c.EntityRootEnabled)!==c.EntityRootEnabled?r:(t&c.StatelessEnabled)!==c.StatelessEnabled?e:"function"==typeof n?n():n}(t,u,n,f),d=(0,l.useLatest)(o),v=(t&c.EntityRootEnabled)===c.EntityRootEnabled,E=j(r,t,(function(){if(!v)return new y.EntityStore(null);var e=(t&c.StatelessEnabled)===c.StatelessEnabled;return new y.EntityStore(b,{onChange:function(t){e||s(t)}})}));return v&&(E.value=b),(0,e.useEffect)((function(){if((t&c.EntityEnabled)===c.EntityEnabled){var e=function(t,e){var n=d.current,r=n.onChange,o=n.watch;o&&_(o,t,e),null==r||r(t,e)};return E.watch(e),function(){E.unwatch(e)}}}),[t,E,d]),(0,l.useCreation)((function(){return[b,E]}),[b,E])}(k,C,void 0===B?null:B,x),2),Y=W[0],q=W[1],z=j(V,k,(function(){return(k&c.EntityEnabled)!==c.EntityEnabled?G(x):function(t,e,n){n.watch,n.onChange;var r=n.options,o=function(t,e){if(null==t)return{};var n,r,o=function(t,e){if(null==t)return{};var n,r,o={},a=Object.keys(t);for(r=0;r<a.length;r++)n=a[r],e.indexOf(n)>=0||(o[n]=t[n]);return o}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(r=0;r<a.length;r++)n=a[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}(n,d);return(0,y.createEntityReducers)(e,t,E(E(E({},o),r),{},{onGenerate:function(t,e){return e}}))}(M,q,x)}),A),H=function(t,n,r,a){var u=r.value,i=(0,e.useMemo)((function(){return(t&c.EntityEnabled)===c.EntityEnabled?{store:r,reducers:a,statuses:t}:{reducers:a,statuses:t}}),[t,u,r,a]),f=(0,l.useLatest)(i);return s((function(t){var e=t.children,r=t.with,a=void 0===r?[]:r,u=n.Provider;return o().createElement(u,{value:f.current},a.reduceRight((function(t,e){return o().createElement(e,{},t)}),e))}))}(k,I,q,z);return(0,l.useCreation)((function(){if((k&c.EntityEnabled)!==c.EntityEnabled)return z;var t=(k&c.RootEnabled)===c.RootEnabled,e=function(t,e){var n={};return Object.entries(t).forEach((function(t){var r=i(t,2),o=r[0],a=r[1];n[o]=w(a,e)})),n}(z,{onShouldCache:function(){return n.current}});return t?[Y,e,H]:(F&c.GlobalEnabled)===c.GlobalEnabled?e:[Y,e]}),[k,F,Y,z,H,n])},A=function(n){var r=n.usecase,o=n.watch,a=n.onChange;return x(r,{watch:o,onChange:a}),(0,t.jsx)(e.Fragment,{})},N=function(t,e,n,r){return x(t,e,S.Global,n,r)},G=function(t,e,n,r){return x(t,e,S.Stateless,n,r)}})();var o=usecases="undefined"==typeof usecases?{}:usecases;for(var a in r)o[a]=r[a];r.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})();
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { UseCaseFragmentProps } from './types';
|
|
2
|
-
import {
|
|
3
|
-
export declare const UseCaseFragment: <T, TEntityReducers extends
|
|
2
|
+
import { EntityReducers } from '@mic-rexjs/usecases';
|
|
3
|
+
export declare const UseCaseFragment: <T, TEntityReducers extends EntityReducers<T>>({ usecase, watch, onChange, }: UseCaseFragmentProps<T, TEntityReducers>) => React.ReactElement;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntityReducers, EntityUseCase, UseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { EntityWatchMap } from '../../hooks/useUseCase/types';
|
|
3
|
-
export interface UseCaseFragmentProps<T, TEntityReducers extends
|
|
4
|
-
usecase: EntityUseCase<T, TEntityReducers> & UseCase<
|
|
3
|
+
export interface UseCaseFragmentProps<T, TEntityReducers extends EntityReducers<T>> {
|
|
4
|
+
usecase: EntityUseCase<T, TEntityReducers> & UseCase<EntityReducers<T>>;
|
|
5
5
|
watch?: EntityWatchMap<T>;
|
|
6
6
|
onChange?(newEntity: T, oldEntity: T): void;
|
|
7
7
|
}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
|
|
2
|
+
import { UseCaseContextValue } from './types';
|
|
3
|
+
import { Reducers } from '@mic-rexjs/usecases';
|
|
4
|
+
export declare const defaultUseCaseContext: import("react").Context<UseCaseContextValue<Reducers> | null>;
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import {
|
|
2
|
+
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
3
|
+
import { AsyncEntityGenerator, EntityGenerator, EntityReducer, EntityReducers, EntityStore, ReducerKeys, Reducers } from '@mic-rexjs/usecases';
|
|
3
4
|
export interface ChangeCallback<T> {
|
|
4
5
|
(newEntity: T, oldEntity: T): void;
|
|
5
6
|
}
|
|
6
7
|
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
|
-
export type ContextualEntityReducers<T, TEntityReducers extends
|
|
8
|
-
[K in
|
|
8
|
+
export type ContextualEntityReducers<T, TEntityReducers extends EntityReducers<T>> = {
|
|
9
|
+
[K in ReducerKeys<TEntityReducers>]: ContextualEntityReducer<T, TEntityReducers[K]>;
|
|
9
10
|
};
|
|
10
|
-
export interface UseCaseContextValue<T extends
|
|
11
|
+
export interface UseCaseContextValue<T extends Reducers> {
|
|
11
12
|
reducers: T;
|
|
13
|
+
statuses: UseCaseStatuses;
|
|
12
14
|
}
|
|
13
|
-
export interface EntityUseCaseContextValue<T, TEntityReducers extends
|
|
15
|
+
export interface EntityUseCaseContextValue<T, TEntityReducers extends EntityReducers<T>> extends UseCaseContextValue<ContextualEntityReducers<T, TEntityReducers>> {
|
|
14
16
|
store: EntityStore<T>;
|
|
15
17
|
}
|
|
16
18
|
export interface UseCaseContext<T> extends React.Context<T | null> {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Reducers, UseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { UseCaseContext, UseCaseContextValue } from '../defaultUseCaseContext/types';
|
|
3
3
|
export interface UseCaseContextReference<T> {
|
|
4
4
|
value: UseCaseContext<T>;
|
|
5
5
|
times: number;
|
|
6
6
|
}
|
|
7
|
-
export interface UseCaseContextReferenceMap<T extends
|
|
7
|
+
export interface UseCaseContextReferenceMap<T extends Reducers, TUseCaseOptions extends object, TContextValue extends UseCaseContextValue<T> = UseCaseContextValue<T>, TKey extends UseCase<T, TUseCaseOptions> = UseCase<T, TUseCaseOptions>, TValue extends UseCaseContextReference<TContextValue> = UseCaseContextReference<TContextValue>> extends Map<TKey, TValue> {
|
|
8
8
|
}
|
|
@@ -7,12 +7,9 @@ export const useArgumentTypes = (args) => {
|
|
|
7
7
|
const type2 = typeof arg2;
|
|
8
8
|
if (type2 === 'function') {
|
|
9
9
|
types |= UseCaseArgumentTypes.Entity;
|
|
10
|
-
|
|
11
|
-
switch ('number') {
|
|
12
|
-
case type2:
|
|
13
|
-
case typeof arg3:
|
|
10
|
+
if (typeof arg3 === 'number') {
|
|
14
11
|
types |= UseCaseArgumentTypes.Mode;
|
|
15
|
-
|
|
12
|
+
}
|
|
16
13
|
}
|
|
17
14
|
return types;
|
|
18
15
|
});
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
2
2
|
import { CreateContextualItemFactory } from './types';
|
|
3
|
-
export declare const useContextualItem: <T>(
|
|
3
|
+
export declare const useContextualItem: <T>(contextItem: T | null, statuses: UseCaseStatuses, createFactory: CreateContextualItemFactory<T>, deps?: unknown[]) => T;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useCreation } from 'ahooks';
|
|
2
2
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
3
3
|
import { useMemoizedCall } from '../useMemoizedCall';
|
|
4
|
-
export const useContextualItem = (
|
|
4
|
+
export const useContextualItem = (contextItem, statuses, createFactory, deps = []) => {
|
|
5
5
|
const create = useMemoizedCall(createFactory, deps);
|
|
6
6
|
return useCreation(() => {
|
|
7
7
|
const rootEnabled = (statuses & UseCaseStatuses.RootEnabled) === UseCaseStatuses.RootEnabled;
|
|
@@ -11,13 +11,13 @@ export const useEntity = (statuses, rootEntity, contextStore, options) => {
|
|
|
11
11
|
const renderingEntity = getRenderingEntity(statuses, entityState, rootEntity, contextEntity);
|
|
12
12
|
const optionsRef = useLatest(options);
|
|
13
13
|
const entityRootEnabled = (statuses & UseCaseStatuses.EntityRootEnabled) === UseCaseStatuses.EntityRootEnabled;
|
|
14
|
-
const store = useContextualItem(
|
|
14
|
+
const store = useContextualItem(contextStore, statuses, () => {
|
|
15
15
|
if (!entityRootEnabled) {
|
|
16
16
|
return new EntityStore(null);
|
|
17
17
|
}
|
|
18
18
|
const stateless = (statuses & UseCaseStatuses.StatelessEnabled) === UseCaseStatuses.StatelessEnabled;
|
|
19
19
|
return new EntityStore(renderingEntity, {
|
|
20
|
-
onChange(
|
|
20
|
+
onChange(newEntity) {
|
|
21
21
|
if (stateless) {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
@@ -33,17 +33,16 @@ export const useEntity = (statuses, rootEntity, contextStore, options) => {
|
|
|
33
33
|
if ((statuses & UseCaseStatuses.EntityEnabled) !== UseCaseStatuses.EntityEnabled) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
|
-
const onEntityChange = (
|
|
37
|
-
const { newEntity, oldEntity } = e;
|
|
36
|
+
const onEntityChange = (newEntity, oldEntity) => {
|
|
38
37
|
const { onChange, watch } = optionsRef.current;
|
|
39
38
|
if (watch) {
|
|
40
39
|
triggerWatchers(watch, newEntity, oldEntity);
|
|
41
40
|
}
|
|
42
41
|
onChange?.(newEntity, oldEntity);
|
|
43
42
|
};
|
|
44
|
-
store.
|
|
43
|
+
store.watch(onEntityChange);
|
|
45
44
|
return () => {
|
|
46
|
-
store.
|
|
45
|
+
store.unwatch(onEntityChange);
|
|
47
46
|
};
|
|
48
47
|
}, [statuses, store, optionsRef]);
|
|
49
48
|
return useCreation(() => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useUseCase } from '../useUseCase';
|
|
2
2
|
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
3
|
-
export const useGlobalUseCase = ((useCase, options, deps) => {
|
|
4
|
-
return useUseCase(useCase, UseCaseModes.Global, options, deps);
|
|
3
|
+
export const useGlobalUseCase = ((entity, useCase, options, deps) => {
|
|
4
|
+
return useUseCase(entity, useCase, UseCaseModes.Global, options, deps);
|
|
5
5
|
});
|
|
@@ -1,21 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { entityUseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { describe, expect, jest, test } from '@jest/globals';
|
|
3
3
|
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
4
4
|
import { renderHook } from '@testing-library/react';
|
|
5
5
|
import * as useUseCaseModule from '../useUseCase';
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { useGlobalUseCase } from '.';
|
|
7
|
+
const numberUseCase = () => {
|
|
8
|
+
return entityUseCase();
|
|
8
9
|
};
|
|
9
10
|
describe('useGlobalUseCase', () => {
|
|
10
|
-
describe('`useGlobalUseCase` should work the same as `
|
|
11
|
-
test('
|
|
11
|
+
describe('`useGlobalUseCase` should work the same as `RootCoreCollectionHook`', () => {
|
|
12
|
+
test('should pass `UseCaseModes.Global` to `useUseCase`', () => {
|
|
12
13
|
const useMockedUseCase = jest.fn();
|
|
13
14
|
jest.spyOn(useUseCaseModule, 'useUseCase').mockImplementation(useMockedUseCase);
|
|
14
15
|
renderHook(() => {
|
|
15
|
-
useGlobalUseCase(
|
|
16
|
+
useGlobalUseCase(1, numberUseCase);
|
|
16
17
|
});
|
|
17
|
-
expect(useMockedUseCase).toHaveBeenCalledWith(
|
|
18
|
+
expect(useMockedUseCase).toHaveBeenCalledWith(1, numberUseCase, UseCaseModes.Global, void 0, void 0);
|
|
18
19
|
jest.spyOn(useUseCaseModule, 'useUseCase').mockRestore();
|
|
19
20
|
});
|
|
21
|
+
test('should should return `CoreCollection` with Provider', () => {
|
|
22
|
+
const { result } = renderHook(() => {
|
|
23
|
+
return useGlobalUseCase(1, numberUseCase);
|
|
24
|
+
});
|
|
25
|
+
const { current } = result;
|
|
26
|
+
expect(current).toEqual([
|
|
27
|
+
1,
|
|
28
|
+
{
|
|
29
|
+
setEntity: expect.any(Function),
|
|
30
|
+
},
|
|
31
|
+
expect.any(Function),
|
|
32
|
+
void 0,
|
|
33
|
+
void 0,
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
20
36
|
});
|
|
21
37
|
});
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export interface GlobalUseCaseHook {
|
|
4
|
-
<T extends Reducers, TUseCaseOptions extends object = object>(usecase: UseCase<T, TUseCaseOptions>, options?: TUseCaseOptions, deps?: unknown[]): PseudoCoreCollection<T>;
|
|
1
|
+
import { RootCoreCollectionHook } from '../useUseCase/types';
|
|
2
|
+
export interface GlobalUseCaseHook extends RootCoreCollectionHook {
|
|
5
3
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EntityStore,
|
|
1
|
+
import { EntityStore, Reducers } from '@mic-rexjs/usecases';
|
|
2
2
|
import { UseCaseContext, UseCaseContextValue } from '../../configs/defaultUseCaseContext/types';
|
|
3
3
|
import { UseCaseProvider } from './types';
|
|
4
4
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
5
|
-
export declare const useProvider: <T, TReducers extends
|
|
5
|
+
export declare const useProvider: <T, TReducers extends Reducers>(statuses: UseCaseStatuses, context: UseCaseContext<UseCaseContextValue<TReducers>>, store: EntityStore<T>, reducers: TReducers) => UseCaseProvider;
|
|
@@ -10,9 +10,10 @@ export const useProvider = (statuses, context, store, reducers) => {
|
|
|
10
10
|
return {
|
|
11
11
|
store,
|
|
12
12
|
reducers,
|
|
13
|
+
statuses,
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
|
-
return { reducers };
|
|
16
|
+
return { reducers, statuses };
|
|
16
17
|
}, [statuses, entity, store, reducers]);
|
|
17
18
|
const contextValueRef = useLatest(contextValue);
|
|
18
19
|
return useConstantFn(({ children, with: withProviders = [] }) => {
|
|
@@ -12,24 +12,22 @@ import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
|
12
12
|
import { useEntity } from '../useEntity';
|
|
13
13
|
import { useContextualItem } from '../useContextualItem';
|
|
14
14
|
import { cacheCalls } from '../../methods/cacheCalls';
|
|
15
|
-
import { useSafeMode } from '../useSafeMode';
|
|
16
15
|
export const useUseCase = ((...args) => {
|
|
16
|
+
const isRenderingRef = useIsRenderingRef();
|
|
17
17
|
const argumentTypes = useArgumentTypes(args);
|
|
18
18
|
const fullArguments = fillArguments(args, argumentTypes);
|
|
19
|
-
const [unsafeEntity, unsafeUsecase,
|
|
19
|
+
const [unsafeEntity, unsafeUsecase, mode, options, deps] = fullArguments;
|
|
20
20
|
const unkownUsecase = useConstantFn(unsafeUsecase);
|
|
21
21
|
const usecase = unkownUsecase;
|
|
22
22
|
const entityUseCase = unkownUsecase;
|
|
23
|
-
const
|
|
24
|
-
const mode = useSafeMode(unsafeMode, argumentTypes);
|
|
25
|
-
const context = useUseCaseContext(unkownUsecase, argumentTypes, mode);
|
|
23
|
+
const context = useUseCaseContext(unkownUsecase, argumentTypes);
|
|
26
24
|
const contextValue = useContext(context);
|
|
27
25
|
const entityContextValue = contextValue;
|
|
28
26
|
const statuses = useUseCaseStatuses(argumentTypes, mode, contextValue);
|
|
29
|
-
const { reducers: contextReducers = null } = contextValue || {};
|
|
27
|
+
const { reducers: contextReducers = null, statuses: contextStatueses = UseCaseStatuses.None } = contextValue || {};
|
|
30
28
|
const { store: contextStore = null } = entityContextValue || {};
|
|
31
29
|
const [entity, store] = useEntity(statuses, unsafeEntity, contextStore, options);
|
|
32
|
-
const reducers = useContextualItem(
|
|
30
|
+
const reducers = useContextualItem(contextReducers, statuses, () => {
|
|
33
31
|
if ((statuses & UseCaseStatuses.EntityEnabled) !== UseCaseStatuses.EntityEnabled) {
|
|
34
32
|
return usecase(options);
|
|
35
33
|
}
|
|
@@ -38,13 +36,10 @@ export const useUseCase = ((...args) => {
|
|
|
38
36
|
}, deps);
|
|
39
37
|
const Provider = useProvider(statuses, context, store, reducers);
|
|
40
38
|
return useCreation(() => {
|
|
41
|
-
if ((statuses & UseCaseStatuses.
|
|
39
|
+
if ((statuses & UseCaseStatuses.EntityEnabled) !== UseCaseStatuses.EntityEnabled) {
|
|
42
40
|
return reducers;
|
|
43
41
|
}
|
|
44
42
|
const rootEnabled = (statuses & UseCaseStatuses.RootEnabled) === UseCaseStatuses.RootEnabled;
|
|
45
|
-
if ((statuses & UseCaseStatuses.EntityEnabled) !== UseCaseStatuses.EntityEnabled) {
|
|
46
|
-
return rootEnabled ? [reducers, Provider] : reducers;
|
|
47
|
-
}
|
|
48
43
|
const cachedReducers = cacheCalls(reducers, {
|
|
49
44
|
onShouldCache() {
|
|
50
45
|
return isRenderingRef.current;
|
|
@@ -53,6 +48,9 @@ export const useUseCase = ((...args) => {
|
|
|
53
48
|
if (rootEnabled) {
|
|
54
49
|
return [entity, cachedReducers, Provider];
|
|
55
50
|
}
|
|
51
|
+
if ((contextStatueses & UseCaseStatuses.GlobalEnabled) === UseCaseStatuses.GlobalEnabled) {
|
|
52
|
+
return cachedReducers;
|
|
53
|
+
}
|
|
56
54
|
return [entity, cachedReducers];
|
|
57
|
-
}, [statuses, entity, reducers, Provider, isRenderingRef]);
|
|
55
|
+
}, [statuses, contextStatueses, entity, reducers, Provider, isRenderingRef]);
|
|
58
56
|
});
|
|
@@ -6,7 +6,6 @@ import { useUseCase } from '.';
|
|
|
6
6
|
import { useDeepCompareEffect, useMemoizedFn, useMount, useUpdate, useUpdateEffect } from 'ahooks';
|
|
7
7
|
import { Fragment, useEffect, useRef, useState } from 'react';
|
|
8
8
|
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
9
|
-
import { UseCaseModeErrors } from '../../enums/UseCaseModeErrors';
|
|
10
9
|
const EXT_1 = '.png';
|
|
11
10
|
const EXT_2 = '.jpg';
|
|
12
11
|
const PATH_1 = `hello${EXT_1}`;
|
|
@@ -126,11 +125,12 @@ beforeEach(() => {
|
|
|
126
125
|
});
|
|
127
126
|
describe('useUseCase', () => {
|
|
128
127
|
describe('`useUseCase` should work the same as `useRootCoreCollection`', () => {
|
|
129
|
-
test('check
|
|
128
|
+
test('check context type', () => {
|
|
130
129
|
const { result } = renderHook(() => {
|
|
131
130
|
return useUseCase(defaultFile, fileUseCase);
|
|
132
131
|
});
|
|
133
132
|
const { current: cores } = result;
|
|
133
|
+
expect(Array.isArray(cores)).toBe(true);
|
|
134
134
|
expect(cores).toHaveLength(3);
|
|
135
135
|
});
|
|
136
136
|
test('`entity` should equal `defaultFile`', () => {
|
|
@@ -413,64 +413,6 @@ describe('useUseCase', () => {
|
|
|
413
413
|
fireEvent.click(screen.getByText(updateButtonText));
|
|
414
414
|
expect(addReducer).toHaveBeenCalledTimes(3);
|
|
415
415
|
});
|
|
416
|
-
test.each([
|
|
417
|
-
{
|
|
418
|
-
mode: UseCaseModes.Normal,
|
|
419
|
-
toThrow: '',
|
|
420
|
-
},
|
|
421
|
-
{
|
|
422
|
-
mode: UseCaseModes.Global,
|
|
423
|
-
toThrow: UseCaseModeErrors.UnsupportedGlobal,
|
|
424
|
-
},
|
|
425
|
-
{
|
|
426
|
-
mode: UseCaseModes.Stateless,
|
|
427
|
-
toThrow: '',
|
|
428
|
-
},
|
|
429
|
-
])('does not support global mode', ({ mode, toThrow }) => {
|
|
430
|
-
renderHook(() => {
|
|
431
|
-
expect(() => {
|
|
432
|
-
useUseCase(defaultFile, fileUseCase, mode);
|
|
433
|
-
// 如果上面测试成功,则手动 throw '',保证与 toThrow 的值一致
|
|
434
|
-
throw '';
|
|
435
|
-
}).toThrow(toThrow);
|
|
436
|
-
});
|
|
437
|
-
});
|
|
438
|
-
test('stateless mode should not generate new reducers when `yeild entity`', () => {
|
|
439
|
-
const onUpdate = jest.fn();
|
|
440
|
-
const { result, rerender } = renderHook((file = defaultFile) => {
|
|
441
|
-
useUpdateEffect(() => {
|
|
442
|
-
onUpdate();
|
|
443
|
-
});
|
|
444
|
-
return useUseCase(file, fileUseCase, UseCaseModes.Stateless);
|
|
445
|
-
});
|
|
446
|
-
const { current: cores } = result;
|
|
447
|
-
const [, { setPath }] = cores;
|
|
448
|
-
setPath(PATH_1);
|
|
449
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
450
|
-
expect(result.current[0].path).toBe('');
|
|
451
|
-
expect(result.current[1].setPath).toBe(setPath);
|
|
452
|
-
rerender({ ...defaultFile, path: PATH_1 });
|
|
453
|
-
expect(result.current[0].path).toBe(PATH_1);
|
|
454
|
-
expect(result.current[1].setPath).not.toBe(setPath);
|
|
455
|
-
});
|
|
456
|
-
test('stateless mode should not trigger update when after `yield entity`', () => {
|
|
457
|
-
const onUpdate = jest.fn();
|
|
458
|
-
const { result } = renderHook(() => {
|
|
459
|
-
useUpdateEffect(() => {
|
|
460
|
-
onUpdate();
|
|
461
|
-
});
|
|
462
|
-
return useUseCase(defaultFile, fileUseCase, UseCaseModes.Stateless);
|
|
463
|
-
});
|
|
464
|
-
const { current: cores } = result;
|
|
465
|
-
const [, reducers] = cores;
|
|
466
|
-
const { setPath } = reducers;
|
|
467
|
-
act(() => {
|
|
468
|
-
setPath(PATH_1);
|
|
469
|
-
});
|
|
470
|
-
expect(result.current).toBe(cores);
|
|
471
|
-
expect(result.current).toEqual(cores);
|
|
472
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
473
|
-
});
|
|
474
416
|
test('`options.onChange` should be trigger when entity has changed', () => {
|
|
475
417
|
const onChange = jest.fn();
|
|
476
418
|
const { result } = renderHook(() => {
|
|
@@ -1171,6 +1113,52 @@ describe('useUseCase', () => {
|
|
|
1171
1113
|
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
1172
1114
|
});
|
|
1173
1115
|
});
|
|
1116
|
+
describe('`useUseCase` should work the same as `ModeCoreCollectionHook`', () => {
|
|
1117
|
+
test.each([UseCaseModes.Normal, UseCaseModes.Global, UseCaseModes.Stateless, UseCaseModes.StatelessGlobal])('check context type', (mode) => {
|
|
1118
|
+
const { result } = renderHook(() => {
|
|
1119
|
+
return useUseCase(defaultFile, fileUseCase, mode);
|
|
1120
|
+
});
|
|
1121
|
+
const { current: cores } = result;
|
|
1122
|
+
expect(Array.isArray(cores)).toBe(true);
|
|
1123
|
+
expect(cores).toHaveLength(3);
|
|
1124
|
+
});
|
|
1125
|
+
test('stateless mode should not generate new reducers when `yeild entity`', () => {
|
|
1126
|
+
const onUpdate = jest.fn();
|
|
1127
|
+
const { result, rerender } = renderHook((file = defaultFile) => {
|
|
1128
|
+
useUpdateEffect(() => {
|
|
1129
|
+
onUpdate();
|
|
1130
|
+
});
|
|
1131
|
+
return useUseCase(file, fileUseCase, UseCaseModes.Stateless);
|
|
1132
|
+
});
|
|
1133
|
+
const { current: cores } = result;
|
|
1134
|
+
const [, { setPath }] = cores;
|
|
1135
|
+
setPath(PATH_1);
|
|
1136
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1137
|
+
expect(result.current[0].path).toBe('');
|
|
1138
|
+
expect(result.current[1].setPath).toBe(setPath);
|
|
1139
|
+
rerender({ ...defaultFile, path: PATH_1 });
|
|
1140
|
+
expect(result.current[0].path).toBe(PATH_1);
|
|
1141
|
+
expect(result.current[1].setPath).not.toBe(setPath);
|
|
1142
|
+
});
|
|
1143
|
+
test('stateless mode should not trigger update when after `yield entity`', () => {
|
|
1144
|
+
const onUpdate = jest.fn();
|
|
1145
|
+
const { result } = renderHook(() => {
|
|
1146
|
+
useUpdateEffect(() => {
|
|
1147
|
+
onUpdate();
|
|
1148
|
+
});
|
|
1149
|
+
return useUseCase(defaultFile, fileUseCase, UseCaseModes.Stateless);
|
|
1150
|
+
});
|
|
1151
|
+
const { current: cores } = result;
|
|
1152
|
+
const [, reducers] = cores;
|
|
1153
|
+
const { setPath } = reducers;
|
|
1154
|
+
act(() => {
|
|
1155
|
+
setPath(PATH_1);
|
|
1156
|
+
});
|
|
1157
|
+
expect(result.current).toBe(cores);
|
|
1158
|
+
expect(result.current).toEqual(cores);
|
|
1159
|
+
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1160
|
+
});
|
|
1161
|
+
});
|
|
1174
1162
|
describe('`useUseCase` should work the same as useContextualCoreCollection', () => {
|
|
1175
1163
|
test.each([void 0, UseCaseModes.Normal])('[mode=%s]: normal mode should trigger Parent & Child to update', (mode) => {
|
|
1176
1164
|
const onParentUpdate = jest.fn();
|
|
@@ -1410,51 +1398,26 @@ describe('useUseCase', () => {
|
|
|
1410
1398
|
expect(onChangeC).toHaveReturnedWith(3);
|
|
1411
1399
|
});
|
|
1412
1400
|
});
|
|
1413
|
-
describe('`useUseCase` should work the same as `
|
|
1414
|
-
test('the return value should be `
|
|
1415
|
-
const { result } = renderHook(() => {
|
|
1416
|
-
return useUseCase(
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
},
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
},
|
|
1434
|
-
])('does not support stateless mode', ({ mode, toThrow }) => {
|
|
1435
|
-
renderHook(() => {
|
|
1436
|
-
expect(() => {
|
|
1437
|
-
useUseCase(mathUseCase, mode);
|
|
1438
|
-
// 如果上面测试成功,则手动 throw '',保证与 toThrow 的值一致
|
|
1439
|
-
throw '';
|
|
1440
|
-
}).toThrow(toThrow);
|
|
1441
|
-
});
|
|
1442
|
-
});
|
|
1443
|
-
test('the return value should be `reducers` object at child component', () => {
|
|
1444
|
-
const onMountA = jest.fn();
|
|
1445
|
-
const A = () => {
|
|
1446
|
-
const reducers = useUseCase(mathUseCase);
|
|
1447
|
-
useMount(() => {
|
|
1448
|
-
onMountA(reducers);
|
|
1449
|
-
});
|
|
1450
|
-
return null;
|
|
1451
|
-
};
|
|
1452
|
-
const B = () => {
|
|
1453
|
-
const [, Provider] = useUseCase(mathUseCase, UseCaseModes.Global);
|
|
1454
|
-
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1455
|
-
};
|
|
1456
|
-
render(_jsx(B, {}));
|
|
1457
|
-
expect(onMountA).toHaveBeenCalledWith(expect.any(Object));
|
|
1401
|
+
describe('`useUseCase` should work the same as `ContextualReducersHook`', () => {
|
|
1402
|
+
test('the return value should be `ContextualEntityReducers`', () => {
|
|
1403
|
+
const { result: rootResult } = renderHook(() => {
|
|
1404
|
+
return useUseCase({
|
|
1405
|
+
...defaultFile,
|
|
1406
|
+
path: PATH_2,
|
|
1407
|
+
ext: EXT_1,
|
|
1408
|
+
}, fileUseCase, UseCaseModes.Global);
|
|
1409
|
+
});
|
|
1410
|
+
const [, , Provider] = rootResult.current;
|
|
1411
|
+
const { result: contextualResult } = renderHook(() => {
|
|
1412
|
+
return useUseCase(fileUseCase);
|
|
1413
|
+
}, {
|
|
1414
|
+
wrapper: Provider,
|
|
1415
|
+
});
|
|
1416
|
+
const { current } = contextualResult;
|
|
1417
|
+
expect(Array.isArray(current)).toBe(false);
|
|
1418
|
+
expect(typeof current).toBe('object');
|
|
1419
|
+
const { isImage } = current;
|
|
1420
|
+
expect(isImage()).toBe(true);
|
|
1458
1421
|
});
|
|
1459
1422
|
});
|
|
1460
1423
|
describe('`useUseCase` should work the same as `useReducers`', () => {
|