@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.
Files changed (47) hide show
  1. package/dist/index.min.js +1 -1
  2. package/es/components/UseCaseFragment/index.d.ts +2 -2
  3. package/es/components/UseCaseFragment/types.d.ts +3 -3
  4. package/es/configs/defaultUseCaseContext/index.d.ts +3 -1
  5. package/es/configs/defaultUseCaseContext/types.d.ts +7 -5
  6. package/es/configs/useCaseContextReferenceMap/types.d.ts +2 -2
  7. package/es/hooks/useArgumentTypes/index.js +2 -5
  8. package/es/hooks/useContextualItem/index.d.ts +1 -1
  9. package/es/hooks/useContextualItem/index.js +1 -1
  10. package/es/hooks/useEntity/index.js +5 -6
  11. package/es/hooks/useGlobalUseCase/index.js +2 -2
  12. package/es/hooks/useGlobalUseCase/index.test.js +23 -7
  13. package/es/hooks/useGlobalUseCase/types.d.ts +2 -4
  14. package/es/hooks/useProvider/index.d.ts +2 -2
  15. package/es/hooks/useProvider/index.js +2 -1
  16. package/es/hooks/useUseCase/index.js +10 -12
  17. package/es/hooks/useUseCase/index.test.js +68 -105
  18. package/es/hooks/useUseCase/types.d.ts +19 -45
  19. package/es/hooks/useUseCaseContext/index.d.ts +2 -3
  20. package/es/hooks/useUseCaseContext/index.js +3 -8
  21. package/es/hooks/useUseCaseContext/index.test.js +2 -30
  22. package/es/hooks/useUseCaseStatuses/index.d.ts +2 -2
  23. package/es/hooks/useUseCaseStatuses/index.js +3 -3
  24. package/es/index.d.ts +1 -1
  25. package/es/methods/fillArguments/index.d.ts +2 -2
  26. package/es/methods/fillArguments/index.js +0 -9
  27. package/es/methods/fillArguments/types.d.ts +3 -3
  28. package/es/methods/initEntityReducers/index.d.ts +2 -2
  29. package/lib/hooks/useArgumentTypes/index.js +2 -5
  30. package/lib/hooks/useContextualItem/index.js +1 -1
  31. package/lib/hooks/useEntity/index.js +5 -8
  32. package/lib/hooks/useGlobalUseCase/index.js +2 -2
  33. package/lib/hooks/useGlobalUseCase/index.test.js +18 -7
  34. package/lib/hooks/useProvider/index.js +4 -2
  35. package/lib/hooks/useUseCase/index.js +12 -12
  36. package/lib/hooks/useUseCase/index.test.js +147 -182
  37. package/lib/hooks/useUseCaseContext/index.js +2 -8
  38. package/lib/hooks/useUseCaseContext/index.test.js +8 -36
  39. package/lib/hooks/useUseCaseStatuses/index.js +3 -3
  40. package/lib/methods/fillArguments/index.js +0 -3
  41. package/package.json +3 -3
  42. package/es/enums/UseCaseModeErrors/index.d.ts +0 -4
  43. package/es/enums/UseCaseModeErrors/index.js +0 -5
  44. package/es/hooks/useSafeMode/index.d.ts +0 -3
  45. package/es/hooks/useSafeMode/index.js +0 -18
  46. package/lib/enums/UseCaseModeErrors/index.js +0 -11
  47. 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 { EntityReducerMap } from '@mic-rexjs/usecases';
3
- export declare const UseCaseFragment: <T, TEntityReducers extends EntityReducerMap<T>>({ usecase, watch, onChange, }: UseCaseFragmentProps<T, TEntityReducers>) => React.ReactElement;
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 { EntityReducerMap, EntityUseCase, UseCase } from '@mic-rexjs/usecases';
1
+ import { EntityReducers, EntityUseCase, UseCase } from '@mic-rexjs/usecases';
2
2
  import { EntityWatchMap } from '../../hooks/useUseCase/types';
3
- export interface UseCaseFragmentProps<T, TEntityReducers extends EntityReducerMap<T>> {
4
- usecase: EntityUseCase<T, TEntityReducers> & UseCase<EntityReducerMap<T>>;
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
- export declare const defaultUseCaseContext: import("react").Context<null>;
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 { AsyncEntityGenerator, EntityGenerator, EntityReducer, EntityReducerMap, EntityStore, ReducerMap } from '@mic-rexjs/usecases';
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 EntityReducerMap<T>> = {
8
- [K in keyof TEntityReducers]: ContextualEntityReducer<T, TEntityReducers[K]>;
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 ReducerMap> {
11
+ export interface UseCaseContextValue<T extends Reducers> {
11
12
  reducers: T;
13
+ statuses: UseCaseStatuses;
12
14
  }
13
- export interface EntityUseCaseContextValue<T, TEntityReducers extends EntityReducerMap<T>> extends UseCaseContextValue<ContextualEntityReducers<T, TEntityReducers>> {
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 { ReducerMap, UseCase } from '@mic-rexjs/usecases';
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 ReducerMap, 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> {
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
- break;
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>(statuses: UseCaseStatuses, contextItem: T | null, createFactory: CreateContextualItemFactory<T>, deps?: unknown[]) => 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 = (statuses, contextItem, createFactory, deps = []) => {
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(statuses, contextStore, () => {
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({ newEntity }) {
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 = (e) => {
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.addEventListener('change', onEntityChange);
43
+ store.watch(onEntityChange);
45
44
  return () => {
46
- store.removeEventListener('change', onEntityChange);
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 { useGlobalUseCase } from '.';
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
- const mathUseCase = () => {
7
- return {};
6
+ import { useGlobalUseCase } from '.';
7
+ const numberUseCase = () => {
8
+ return entityUseCase();
8
9
  };
9
10
  describe('useGlobalUseCase', () => {
10
- describe('`useGlobalUseCase` should work the same as `GlobalPseudoCoreCollectionHook`', () => {
11
- test('check `useUseCase` has received correct arguments', () => {
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(mathUseCase);
16
+ useGlobalUseCase(1, numberUseCase);
16
17
  });
17
- expect(useMockedUseCase).toHaveBeenCalledWith(mathUseCase, UseCaseModes.Global, void 0, void 0);
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 { Reducers, UseCase } from '@mic-rexjs/usecases';
2
- import { PseudoCoreCollection } from '../useUseCase/types';
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, ReducerMap } from '@mic-rexjs/usecases';
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 ReducerMap<import("@mic-rexjs/usecases").Reducer<unknown>>>(statuses: UseCaseStatuses, context: UseCaseContext<UseCaseContextValue<TReducers>>, store: EntityStore<T>, reducers: TReducers) => UseCaseProvider;
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, unsafeMode, options, deps] = fullArguments;
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 isRenderingRef = useIsRenderingRef();
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(statuses, contextReducers, () => {
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.ContextEnabled) !== UseCaseStatuses.ContextEnabled) {
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 `context.length`', () => {
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 `usePseudoCoreCollection`', () => {
1414
- test('the return value should be `PseudoCoreCollection`', () => {
1415
- const { result } = renderHook(() => {
1416
- return useUseCase(mathUseCase, UseCaseModes.Global);
1417
- });
1418
- const { current } = result;
1419
- expect(current).toEqual([expect.any(Object), expect.any(Function)]);
1420
- });
1421
- test.each([
1422
- {
1423
- mode: UseCaseModes.Normal,
1424
- toThrow: '',
1425
- },
1426
- {
1427
- mode: UseCaseModes.Global,
1428
- toThrow: '',
1429
- },
1430
- {
1431
- mode: UseCaseModes.Stateless,
1432
- toThrow: UseCaseModeErrors.UnsupportedStateless,
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`', () => {