@mic-rexjs/usecases-react 2.4.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/es/enums/UseCaseArgumentTypes/index.d.ts +1 -2
- package/es/enums/UseCaseArgumentTypes/index.js +0 -1
- package/es/enums/UseCaseStatuses/index.d.ts +1 -3
- package/es/enums/UseCaseStatuses/index.js +0 -4
- package/es/hooks/useArgumentTypes/index.js +1 -4
- package/es/hooks/useEntity/index.js +9 -12
- package/es/hooks/useRuntimeEntity/index.d.ts +2 -1
- package/es/hooks/useRuntimeEntity/index.js +2 -11
- package/es/hooks/useUseCase/index.js +2 -2
- package/es/hooks/useUseCase/index.test.js +53 -129
- package/es/hooks/useUseCase/types.d.ts +2 -6
- package/es/hooks/useUseCaseStatuses/index.d.ts +1 -2
- package/es/hooks/useUseCaseStatuses/index.js +2 -11
- package/es/index.d.ts +0 -2
- package/es/index.js +0 -2
- package/es/methods/fillArguments/index.js +2 -20
- package/es/methods/fillArguments/types.d.ts +0 -2
- package/lib/enums/UseCaseArgumentTypes/index.js +0 -1
- package/lib/enums/UseCaseStatuses/index.js +0 -4
- package/lib/hooks/useArgumentTypes/index.js +2 -6
- package/lib/hooks/useEntity/index.js +7 -15
- package/lib/hooks/useRuntimeEntity/index.js +2 -11
- package/lib/hooks/useUseCase/index.js +4 -5
- package/lib/hooks/useUseCase/index.test.js +147 -248
- package/lib/hooks/useUseCaseStatuses/index.js +2 -11
- package/lib/index.js +1 -15
- package/lib/methods/fillArguments/index.js +4 -10
- package/package.json +2 -2
- package/es/enums/UseCaseModes/index.d.ts +0 -5
- package/es/enums/UseCaseModes/index.js +0 -6
- package/es/hooks/useStateControllableUseCase/index.d.ts +0 -2
- package/es/hooks/useStateControllableUseCase/index.js +0 -5
- package/es/hooks/useStateControllableUseCase/index.test.d.ts +0 -1
- package/es/hooks/useStateControllableUseCase/index.test.js +0 -37
- package/es/hooks/useStateControllableUseCase/types.d.ts +0 -3
- package/es/hooks/useStateControllableUseCase/types.js +0 -1
- package/es/hooks/useStatelessUseCase/index.d.ts +0 -2
- package/es/hooks/useStatelessUseCase/index.js +0 -5
- package/es/hooks/useStatelessUseCase/index.test.d.ts +0 -1
- package/es/hooks/useStatelessUseCase/index.test.js +0 -37
- package/es/hooks/useStatelessUseCase/types.d.ts +0 -3
- package/es/hooks/useStatelessUseCase/types.js +0 -1
- package/lib/enums/UseCaseModes/index.js +0 -12
- package/lib/hooks/useStateControllableUseCase/index.js +0 -11
- package/lib/hooks/useStateControllableUseCase/index.test.js +0 -37
- package/lib/hooks/useStateControllableUseCase/types.js +0 -5
- package/lib/hooks/useStatelessUseCase/index.js +0 -11
- package/lib/hooks/useStatelessUseCase/index.test.js +0 -37
- package/lib/hooks/useStatelessUseCase/types.js +0 -5
package/dist/index.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see index.min.js.LICENSE.txt */
|
|
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,f=null;for(r in void 0!==n&&(c=""+n),void 0!==e.key&&(c=""+e.key),void 0!==e.ref&&(f=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:f,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,useStateControllableUseCase:()=>M,useStatelessUseCase:()=>N,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){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.")}()}function l(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 c=ahooks;var f,s=function(t){return l((0,e.useState)((function(){return t})),1)[0]};function y(t){return y="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},y(t)}function b(t){var e=function(t,e){if("object"!=y(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!=y(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==y(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.StateControllableEnabled=72]="StateControllableEnabled",t[t.StatelessEnabled=136]="StatelessEnabled"}(f||(f={}));const d=usecases;var v=["watch","onChange","options"];function E(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 p(t){for(var e=1;e<arguments.length;e++){var n=null!=arguments[e]?arguments[e]:{};e%2?E(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)):E(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}var m,h=function(t){return l((0,e.useState)(t),1)[0]},S=new Map;!function(t){t[t.None=0]="None",t[t.Entity=2]="Entity",t[t.Mode=4]="Mode"}(m||(m={}));var g,O=(0,e.createContext)(null);!function(t){t[t.Normal=0]="Normal",t[t.StateControllable=1]="StateControllable",t[t.Stateless=2]="Stateless"}(g||(g={}));var w=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},C=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 w(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,f=l.returnValue;if(i(c,o))return f}var s=t.apply(void 0,o);return e&&(n={parameters:o,returnValue:s}),s}},j=function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=(0,c.useLatest)(n),a=(0,c.useCreation)((function(){return C(o.current,{onCompare:function(){return!0}})}),[r,o]);return(0,c.useCreation)((function(){return(e&f.RootEnabled)!==f.RootEnabled&&t?t:a()}),[e,t,a])},R=function(t,e){return"object"===y(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,c=l(r.match(/^([^.]+)\.(.+)$/)||[],3),f=c[1],s=void 0===f?r:f,y=c[2],b=void 0===y?"":y,d=R(e,s),v=R(n,s),E=[].concat(i(a),[s]);if(d||v){var p=d?e[s]:u,m=v?n[s]:u;if(b)return void t(p,m,b,o,E);if(p===m)return;o(p,m,E)}else if(!/^\d+^/.test(s))for(var h=Array.isArray(e)?e:[],S=Array.isArray(n)?n:[],g=h.length,O=S.length,w=Math.max(g,O),C=0;C<w;C++)t(h[C],S[C],r,o,[].concat(i(a),["".concat(C)]))},_=function(t,e,n){for(var r=function(){var t=l(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 h((function(){var e=m.None,n=l(t,3),r=n[1],o=n[2];return"function"===y(r)&&(e|=m.Entity,"number"==typeof o&&(e|=m.Mode)),e}))}(a),E=function(t,e){var n=l(t,5),r=n[0],o=n[1],a=n[2],u=n[3],i=n[4],c=(e&m.Entity)===m.Entity,f=(e&m.Mode)===m.Mode;return c?f?[r,o,a,u||{},i||[]]:[r,o,g.Normal,a||{},u||[]]:[null,r,g.Normal,o||{},a||[]]}(a,b),R=l(E,5),P=R[0],x=R[1],A=R[2],M=R[3],N=R[4],k=s(x),I=k,T=k,U=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:m.None,r=S,o=h((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&m.Entity)!==m.Entity)return O;var i=(0,e.createContext)(null);return r.set(t,{value:i,times:1}),i}));return(0,c.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}(k,b),L=(0,e.useContext)(U),D=L,V=function(t,e,n){return(0,c.useCreation)((function(){var r=f.None,o=(n||{}).store;switch((t&m.Entity)===m.Entity&&(r|=f.EntityRootEnabled),r|=n?f.ContextEnabled:f.RootEnabled,o&&(r|=f.EntityEnabled),e){case g.StateControllable:r|=f.StateControllableEnabled;break;case g.Stateless:r|=f.StatelessEnabled}return r}),[t,n,e])}(b,A,L),$=(0,c.useLatest)(M),F=function(t){var n=(0,e.useRef)(0),r=(0,e.useRef)([]),o=r.current,a=w(t,o);return r.current=t,n.current+=a?0:1,n.current}(N),B=(L||{}).reducers,G=void 0===B?null:B,W=(D||{}).store,Y=l(function(t,n,r,o,a){var u=l((0,e.useState)(n),2),i=u[0],s=u[1],y=r?r.value:null,b=function(t,n,r,o){var a=(0,e.useRef)(r);if((t&f.EntityRootEnabled)!==f.EntityRootEnabled)return o;var u="function"==typeof r;if((t&f.StatelessEnabled)===f.StatelessEnabled)return u?r():r;var i=a.current;switch(!0){case(t&f.StateControllableEnabled)!==f.StateControllableEnabled:case u:case i===r:return n}return a.current=r,r}(t,i,n,y),v=(t&f.EntityEnabled)===f.EntityEnabled,E=(t&f.EntityRootEnabled)===f.EntityRootEnabled,p=(0,c.useLatest)(o),m=j(r,t,(function(){if(!E)return new d.EntityStore(null);var e=(t&f.StatelessEnabled)===f.StatelessEnabled;return new d.EntityStore(b,{onChange:function(t){e||s(t)}})}));return E&&(m.value=b),(0,e.useEffect)((function(){if(v){var t=function(t,e){var n=p.current,r=n.onChange,o=n.watch;o&&_(o,t,e),null==r||r(t,e)};return m.watch(t),function(){m.unwatch(t)}}}),[v,m,a,p]),(0,c.useCreation)((function(){return[b,m]}),[b,m])}(V,P,void 0===W?null:W,M,F),2),q=Y[0],z=Y[1],H=j(G,V,(function(){var t,e,n,r=(t=M,e=function(t,e){var n,r;return null===(n=(r=$.current)[t])||void 0===n?void 0:n.call.apply(n,[r].concat(i(e)))},n={},Object.keys(t).forEach((function(r){var o=t[r];n[r]="function"!=typeof o?o:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return e(r,n)}})),n);return(V&f.EntityEnabled)!==f.EntityEnabled?I(r):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,v);return(0,d.createEntityReducers)(e,t,p(p(p({},o),r),{},{onGenerate:function(t,e){return e}}))}(T,z,r)}),F),J=function(t,n,r,a){var u=r.value,i=(0,e.useMemo)((function(){return(t&f.EntityEnabled)===f.EntityEnabled?{store:r,reducers:a,statuses:t}:{reducers:a,statuses:t}}),[t,u,r,a]),l=(0,c.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:l.current},a.reduceRight((function(t,e){return o().createElement(e,{},t)}),e))}))}(V,U,z,H);return(0,c.useCreation)((function(){if((V&f.EntityEnabled)!==f.EntityEnabled)return H;var t=(V&f.RootEnabled)===f.RootEnabled,e=function(t,e){var n={};return Object.entries(t).forEach((function(t){var r=l(t,2),o=r[0],a=r[1];n[o]=C(a,e)})),n}(H,{onShouldCache:function(){return n.current}});return t?[q,e,J]:[q,e]}),[V,q,H,J,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,{})},M=function(t,e,n,r){return x(t,e,g.StateControllable,n,r)},N=function(t,e,n,r){return x(t,e,g.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"),u=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),a=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,c={},l=null,f=null;for(r in void 0!==n&&(l=""+n),void 0!==e.key&&(l=""+e.key),void 0!==e.ref&&(f=e.ref),e)u.call(e,r)&&!i.hasOwnProperty(r)&&(c[r]=e[r]);if(t&&t.defaultProps)for(r in e=t.defaultProps)void 0===c[r]&&(c[r]=e[r]);return{$$typeof:o,type:t,key:l,ref:f,props:c,_owner:a.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 u=e[r]={exports:{}};return t[r](u,u.exports,n),u.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:()=>x,useUseCase:()=>_});var t=n(848),e=n(594),o=n.n(e);function u(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 a(t,e){if(t){if("string"==typeof t)return u(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)?u(t,e):void 0}}function i(t){return function(t){if(Array.isArray(t))return u(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||a(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.")}()}function c(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,u,a,i=[],c=!0,l=!1;try{if(u=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=u.call(n)).done)&&(i.push(r.value),i.length!==e);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(l)throw o}}return i}}(t,e)||a(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 f,s=function(t){return c((0,e.useState)((function(){return t})),1)[0]};function y(t){return y="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},y(t)}function v(t){var e=function(t,e){if("object"!=y(t)||!t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,"string");if("object"!=y(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==y(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"}(f||(f={}));const d=usecases;var b=["watch","onChange","options"];function p(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?p(Object(n),!0).forEach((function(e){var r,o,u;r=t,o=e,u=n[e],(o=v(o))in r?Object.defineProperty(r,o,{value:u,enumerable:!0,configurable:!0,writable:!0}):r[o]=u})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(n)):p(Object(n)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(n,e))}))}return t}var h,m=function(t){return c((0,e.useState)(t),1)[0]},g=new Map;!function(t){t[t.None=0]="None",t[t.Entity=2]="Entity"}(h||(h={}));var O=(0,e.createContext)(null),w=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},j=function(t,e){var n,r=e||{},o=r.onShouldCache,u=void 0===o?function(){return!0}:o,a=r.onCompare,i=void 0===a?function(t,e){return w(t,e)}:a;return function(){for(var e=u(),r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];if(n&&e){var c=n,l=c.parameters,f=c.returnValue;if(i(l,o))return f}var s=t.apply(void 0,o);return e&&(n={parameters:o,returnValue:s}),s}},S=function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=(0,l.useLatest)(n),u=(0,l.useCreation)((function(){return j(o.current,{onCompare:function(){return!0}})}),[r,o]);return(0,l.useCreation)((function(){return(e&f.RootEnabled)!==f.RootEnabled&&t?t:u()}),[e,t,u])},C=function(t,e){return"object"===y(t)&&null!==t&&Object.hasOwn(t,e)},R=function t(e,n,r,o){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],a=void 0,l=c(r.match(/^([^.]+)\.(.+)$/)||[],3),f=l[1],s=void 0===f?r:f,y=l[2],v=void 0===y?"":y,d=C(e,s),b=C(n,s),p=[].concat(i(u),[s]);if(d||b){var E=d?e[s]:a,h=b?n[s]:a;if(v)return void t(E,h,v,o,p);if(E===h)return;o(E,h,p)}else if(!/^\d+^/.test(s))for(var m=Array.isArray(e)?e:[],g=Array.isArray(n)?n:[],O=m.length,w=g.length,j=Math.max(O,w),S=0;S<j;S++)t(m[S],g[S],r,o,[].concat(i(u),["".concat(S)]))},P=function(t,e,n){for(var r=function(){var t=c(u[o],2),r=t[0],a=t[1];R(n,e,r,(function(t,r,o){a({fieldPaths:o,newEntity:e,oldEntity:n,newValue:r,oldValue:t})}))},o=0,u=Object.entries(t);o<u.length;o++)r()},_=function(){for(var t,n=((t=(0,e.useRef)(!0)).current=!0,(0,e.useEffect)((function(){t.current=!1})),t),r=arguments.length,u=new Array(r),a=0;a<r;a++)u[a]=arguments[a];var v=function(t){return m((function(){var e=h.None;return"function"===y(c(t,2)[1])&&(e|=h.Entity),e}))}(u),p=function(t,e){var n=c(t,4),r=n[0],o=n[1],u=n[2],a=n[3];return(e&h.Entity)===h.Entity?[r,o,u||{},a||[]]:[null,r,o||{},u||[]]}(u,v),C=c(p,4),R=C[0],_=C[1],x=C[2],A=C[3],N=s(_),I=N,M=N,k=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:h.None,r=g,o=m((function(){if(r.has(t)){var o=r.get(t),u=o.value,a=o.times;return r.set(t,{value:u,times:a+1}),u}if((n&h.Entity)!==h.Entity)return O;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,u=e.times;o===n&&(1!==u?r.set(t,{value:n,times:u-1}):r.delete(t))}})),o}(N,v),T=(0,e.useContext)(k),L=T,U=function(t,e){return(0,l.useCreation)((function(){var n=f.None,r=(e||{}).store;return(t&h.Entity)===h.Entity&&(n|=f.EntityRootEnabled),n|=e?f.ContextEnabled:f.RootEnabled,r&&(n|=f.EntityEnabled),n}),[t,e])}(v,T),D=(0,l.useLatest)(x),V=function(t){var n=(0,e.useRef)(0),r=(0,e.useRef)([]),o=r.current,u=w(t,o);return r.current=t,n.current+=u?0:1,n.current}(A),$=(T||{}).reducers,F=void 0===$?null:$,B=(L||{}).store,G=c(function(t,n,r,o,u){var a=(0,l.useUpdate)(),i=(0,l.useLatest)(o),c=r?r.value:null,s=(t&f.EntityEnabled)===f.EntityEnabled,y=(t&f.EntityRootEnabled)===f.EntityRootEnabled,v=S(r,t,(function(){if(!y)return new d.EntityStore(null);var t="function"==typeof n;return new d.EntityStore(t?n():n,{onChange:function(){a()}})})),b=function(t,n,r,o){var u=(0,e.useRef)(n);if((o&f.EntityRootEnabled)!==f.EntityRootEnabled)return r;var a="function"==typeof n,i=u.current;switch(!0){case a:case i===n:return t.value}return u.current=n,n}(v,n,c,t);return y&&(v.value=b),(0,e.useEffect)((function(){if(s){var t=function(t,e){var n=i.current,r=n.onChange,o=n.watch;o&&P(o,t,e),null==r||r(t,e)};return v.watch(t),function(){v.unwatch(t)}}}),[s,v,u,i]),(0,l.useCreation)((function(){return[b,v]}),[b,v])}(U,R,void 0===B?null:B,x,V),2),W=G[0],Y=G[1],q=S(F,U,(function(){var t,e,n,r=(t=x,e=function(t,e){var n,r;return null===(n=(r=D.current)[t])||void 0===n?void 0:n.call.apply(n,[r].concat(i(e)))},n={},Object.keys(t).forEach((function(r){var o=t[r];n[r]="function"!=typeof o?o:function(){for(var t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];return e(r,n)}})),n);return(U&f.EntityEnabled)!==f.EntityEnabled?I(r):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={},u=Object.keys(t);for(r=0;r<u.length;r++)n=u[r],e.indexOf(n)>=0||(o[n]=t[n]);return o}(t,e);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(t);for(r=0;r<u.length;r++)n=u[r],e.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}(n,b);return(0,d.createEntityReducers)(e,t,E(E(E({},o),r),{},{onGenerate:function(t,e){return e}}))}(M,Y,r)}),V),z=function(t,n,r,u){var a=r.value,i=(0,e.useMemo)((function(){return(t&f.EntityEnabled)===f.EntityEnabled?{store:r,reducers:u,statuses:t}:{reducers:u,statuses:t}}),[t,a,r,u]),c=(0,l.useLatest)(i);return s((function(t){var e=t.children,r=t.with,u=void 0===r?[]:r,a=n.Provider;return o().createElement(a,{value:c.current},u.reduceRight((function(t,e){return o().createElement(e,{},t)}),e))}))}(U,k,Y,q);return(0,l.useCreation)((function(){if((U&f.EntityEnabled)!==f.EntityEnabled)return q;var t=(U&f.RootEnabled)===f.RootEnabled,e=function(t,e){var n={};return Object.entries(t).forEach((function(t){var r=c(t,2),o=r[0],u=r[1];n[o]=j(u,e)})),n}(q,{onShouldCache:function(){return n.current}});return t?[W,e,z]:[W,e]}),[U,W,q,z,n])},x=function(n){var r=n.usecase,o=n.watch,u=n.onChange;return _(r,{watch:o,onChange:u}),(0,t.jsx)(e.Fragment,{})}})();var o=usecases="undefined"==typeof usecases?{}:usecases;for(var u in r)o[u]=r[u];r.__esModule&&Object.defineProperty(o,"__esModule",{value:!0})})();
|
|
@@ -2,5 +2,4 @@ export var UseCaseArgumentTypes;
|
|
|
2
2
|
(function (UseCaseArgumentTypes) {
|
|
3
3
|
UseCaseArgumentTypes[UseCaseArgumentTypes["None"] = 0] = "None";
|
|
4
4
|
UseCaseArgumentTypes[UseCaseArgumentTypes["Entity"] = 2] = "Entity";
|
|
5
|
-
UseCaseArgumentTypes[UseCaseArgumentTypes["Mode"] = 4] = "Mode";
|
|
6
5
|
})(UseCaseArgumentTypes || (UseCaseArgumentTypes = {}));
|
|
@@ -11,8 +11,4 @@ export var UseCaseStatuses;
|
|
|
11
11
|
UseCaseStatuses[UseCaseStatuses["ContextRootEnabled"] = 22] = "ContextRootEnabled";
|
|
12
12
|
// 是否初始化与 `entity` 相关的 `reducers`
|
|
13
13
|
UseCaseStatuses[UseCaseStatuses["EntityRootEnabled"] = 62] = "EntityRootEnabled";
|
|
14
|
-
// 是否为 `entity` 状态可控
|
|
15
|
-
UseCaseStatuses[UseCaseStatuses["StateControllableEnabled"] = 72] = "StateControllableEnabled";
|
|
16
|
-
// 是否不需要 `entity` 状态管理
|
|
17
|
-
UseCaseStatuses[UseCaseStatuses["StatelessEnabled"] = 136] = "StatelessEnabled";
|
|
18
14
|
})(UseCaseStatuses || (UseCaseStatuses = {}));
|
|
@@ -3,13 +3,10 @@ import { useConstant } from '../useConstant';
|
|
|
3
3
|
export const useArgumentTypes = (args) => {
|
|
4
4
|
return useConstant(() => {
|
|
5
5
|
let types = UseCaseArgumentTypes.None;
|
|
6
|
-
const [, arg2
|
|
6
|
+
const [, arg2] = args;
|
|
7
7
|
const type2 = typeof arg2;
|
|
8
8
|
if (type2 === 'function') {
|
|
9
9
|
types |= UseCaseArgumentTypes.Entity;
|
|
10
|
-
if (typeof arg3 === 'number') {
|
|
11
|
-
types |= UseCaseArgumentTypes.Mode;
|
|
12
|
-
}
|
|
13
10
|
}
|
|
14
11
|
return types;
|
|
15
12
|
});
|
|
@@ -1,31 +1,28 @@
|
|
|
1
|
-
import { useEffect
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
2
|
import { EntityStore } from '@mic-rexjs/usecases';
|
|
3
3
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
4
4
|
import { useContextualItem } from '../useContextualItem';
|
|
5
|
-
import { useCreation, useLatest } from 'ahooks';
|
|
5
|
+
import { useCreation, useLatest, useUpdate } from 'ahooks';
|
|
6
6
|
import { triggerWatchers } from '../../methods/triggerWatchers';
|
|
7
7
|
import { useRuntimeEntity } from '../useRuntimeEntity';
|
|
8
8
|
export const useEntity = (statuses, rootEntity, contextStore, options, depsKey) => {
|
|
9
|
-
const
|
|
9
|
+
const update = useUpdate();
|
|
10
|
+
const optionsRef = useLatest(options);
|
|
10
11
|
const contextEntity = (contextStore ? contextStore.value : null);
|
|
11
|
-
const runtimeEntity = useRuntimeEntity(statuses, entityState, rootEntity, contextEntity);
|
|
12
12
|
const entityEnabled = (statuses & UseCaseStatuses.EntityEnabled) === UseCaseStatuses.EntityEnabled;
|
|
13
13
|
const entityRootEnabled = (statuses & UseCaseStatuses.EntityRootEnabled) === UseCaseStatuses.EntityRootEnabled;
|
|
14
|
-
const optionsRef = useLatest(options);
|
|
15
14
|
const store = useContextualItem(contextStore, statuses, () => {
|
|
16
15
|
if (!entityRootEnabled) {
|
|
17
16
|
return new EntityStore(null);
|
|
18
17
|
}
|
|
19
|
-
const
|
|
20
|
-
return new EntityStore(
|
|
21
|
-
onChange(
|
|
22
|
-
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
setEntityState(newEntity);
|
|
18
|
+
const isFunction = typeof rootEntity === 'function';
|
|
19
|
+
return new EntityStore(isFunction ? rootEntity() : rootEntity, {
|
|
20
|
+
onChange() {
|
|
21
|
+
update();
|
|
26
22
|
},
|
|
27
23
|
});
|
|
28
24
|
});
|
|
25
|
+
const runtimeEntity = useRuntimeEntity(store, rootEntity, contextEntity, statuses);
|
|
29
26
|
if (entityRootEnabled) {
|
|
30
27
|
// 执行同步操作
|
|
31
28
|
store.value = runtimeEntity;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
2
2
|
import { EntityGetter } from '../../hooks/useUseCase/types';
|
|
3
|
-
|
|
3
|
+
import { EntityStore } from '@mic-rexjs/usecases';
|
|
4
|
+
export declare const useRuntimeEntity: <T>(store: EntityStore<T>, rootEntity: T | EntityGetter<T>, contextEntity: T, statuses: UseCaseStatuses) => T;
|
|
@@ -1,26 +1,17 @@
|
|
|
1
1
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
2
2
|
import { useRef } from 'react';
|
|
3
|
-
export const useRuntimeEntity = (
|
|
3
|
+
export const useRuntimeEntity = (store, rootEntity, contextEntity, statuses) => {
|
|
4
4
|
const prevRootEntityRef = useRef(rootEntity);
|
|
5
5
|
const entityRootDisabled = (statuses & UseCaseStatuses.EntityRootEnabled) !== UseCaseStatuses.EntityRootEnabled;
|
|
6
6
|
if (entityRootDisabled) {
|
|
7
7
|
return contextEntity;
|
|
8
8
|
}
|
|
9
9
|
const isFunction = typeof rootEntity === 'function';
|
|
10
|
-
const statelessEnable = (statuses & UseCaseStatuses.StatelessEnabled) === UseCaseStatuses.StatelessEnabled;
|
|
11
|
-
if (statelessEnable) {
|
|
12
|
-
if (isFunction) {
|
|
13
|
-
return rootEntity();
|
|
14
|
-
}
|
|
15
|
-
return rootEntity;
|
|
16
|
-
}
|
|
17
10
|
const { current: prevRootEntity } = prevRootEntityRef;
|
|
18
|
-
const stateControllableDisabled = (statuses & UseCaseStatuses.StateControllableEnabled) !== UseCaseStatuses.StateControllableEnabled;
|
|
19
11
|
switch (true) {
|
|
20
|
-
case stateControllableDisabled:
|
|
21
12
|
case isFunction:
|
|
22
13
|
case prevRootEntity === rootEntity:
|
|
23
|
-
return
|
|
14
|
+
return store.value;
|
|
24
15
|
}
|
|
25
16
|
prevRootEntityRef.current = rootEntity;
|
|
26
17
|
return rootEntity;
|
|
@@ -18,14 +18,14 @@ export const useUseCase = ((...args) => {
|
|
|
18
18
|
const isRenderingRef = useIsRenderingRef();
|
|
19
19
|
const argumentTypes = useArgumentTypes(args);
|
|
20
20
|
const fullArguments = fillArguments(args, argumentTypes);
|
|
21
|
-
const [unsafeEntity, unsafeUsecase,
|
|
21
|
+
const [unsafeEntity, unsafeUsecase, options, deps] = fullArguments;
|
|
22
22
|
const unkownUsecase = useConstantFn(unsafeUsecase);
|
|
23
23
|
const usecase = unkownUsecase;
|
|
24
24
|
const entityUseCase = unkownUsecase;
|
|
25
25
|
const context = useUseCaseContext(unkownUsecase, argumentTypes);
|
|
26
26
|
const contextValue = useContext(context);
|
|
27
27
|
const entityContextValue = contextValue;
|
|
28
|
-
const statuses = useUseCaseStatuses(argumentTypes,
|
|
28
|
+
const statuses = useUseCaseStatuses(argumentTypes, contextValue);
|
|
29
29
|
const optionsRef = useLatest(options);
|
|
30
30
|
const depsKey = useCompareDeps(deps);
|
|
31
31
|
const { reducers: contextReducers = null } = contextValue || {};
|
|
@@ -5,14 +5,12 @@ import { renderHook, act, render, fireEvent, screen } from '@testing-library/rea
|
|
|
5
5
|
import { useUseCase } from '.';
|
|
6
6
|
import { useDeepCompareEffect, useMemoizedFn, useMount, useUpdate, useUpdateEffect } from 'ahooks';
|
|
7
7
|
import { Fragment, useEffect, useRef, useState } from 'react';
|
|
8
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
9
8
|
const EXT_1 = '.png';
|
|
10
9
|
const EXT_2 = '.jpg';
|
|
11
10
|
const PATH_1 = `hello${EXT_1}`;
|
|
12
11
|
const PATH_2 = `hello${EXT_2}`;
|
|
13
12
|
const PARENT_BUTTON_TEXT = 'parent button';
|
|
14
13
|
const CHILD_BUTTON_TEXT = 'child button';
|
|
15
|
-
const allModes = [UseCaseModes.Normal, UseCaseModes.StateControllable, UseCaseModes.Stateless];
|
|
16
14
|
const defaultFile = {
|
|
17
15
|
path: '',
|
|
18
16
|
ext: '',
|
|
@@ -90,8 +88,8 @@ const Child = ({ textPrefix = '', onUpdate, onPathChange, onUndefinedEntity }) =
|
|
|
90
88
|
useUpdateEffect(pathChange, [path, pathChange]);
|
|
91
89
|
return (_jsxs("div", { children: [_jsxs("main", { children: ["child path: ", path, _jsx("br", {}), "child ext: ", ext] }), _jsx("footer", { children: _jsx("button", { onClick: onClick, children: textPrefix + CHILD_BUTTON_TEXT }) })] }));
|
|
92
90
|
};
|
|
93
|
-
const Parent = ({ children,
|
|
94
|
-
const [{ path, ext }, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase
|
|
91
|
+
const Parent = ({ children, onUpdate, onSetPath }) => {
|
|
92
|
+
const [{ path, ext }, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase);
|
|
95
93
|
const onClick = () => {
|
|
96
94
|
setPath(onSetPath?.() || '');
|
|
97
95
|
};
|
|
@@ -145,6 +143,42 @@ describe('useUseCase', () => {
|
|
|
145
143
|
const [entity] = cores;
|
|
146
144
|
expect(entity).toBe(defaultFile);
|
|
147
145
|
});
|
|
146
|
+
test('Should return the `EntityStore.value` if root entity has not changed', () => {
|
|
147
|
+
const { result } = renderHook(() => {
|
|
148
|
+
return useUseCase(defaultFile, fileUseCase);
|
|
149
|
+
});
|
|
150
|
+
const { current: collection } = result;
|
|
151
|
+
const [, { setPath }] = collection;
|
|
152
|
+
act(() => {
|
|
153
|
+
setPath(PATH_1);
|
|
154
|
+
});
|
|
155
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_1, ext: EXT_1 });
|
|
156
|
+
});
|
|
157
|
+
test('Should return the root entity if root entity has changed', () => {
|
|
158
|
+
let file = defaultFile;
|
|
159
|
+
const { result, rerender } = renderHook(() => {
|
|
160
|
+
return useUseCase(file, fileUseCase);
|
|
161
|
+
});
|
|
162
|
+
file = { ...defaultFile, path: PATH_2 };
|
|
163
|
+
rerender();
|
|
164
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_2 });
|
|
165
|
+
// 渲染多一次,避免第二次渲染的 `entity` 没变化而取错缓存的情况
|
|
166
|
+
rerender();
|
|
167
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_2 });
|
|
168
|
+
});
|
|
169
|
+
test('Should return the root entity if root entity has changed even with entity state changed', () => {
|
|
170
|
+
let file = defaultFile;
|
|
171
|
+
const { result } = renderHook(() => {
|
|
172
|
+
return useUseCase(file, fileUseCase);
|
|
173
|
+
});
|
|
174
|
+
const { current: collection } = result;
|
|
175
|
+
const [, { setPath }] = collection;
|
|
176
|
+
act(() => {
|
|
177
|
+
file = { ...defaultFile, path: PATH_2 };
|
|
178
|
+
setPath(PATH_1);
|
|
179
|
+
});
|
|
180
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_2 });
|
|
181
|
+
});
|
|
148
182
|
test('`reducers` should be returned as an object', () => {
|
|
149
183
|
const { result } = renderHook(() => {
|
|
150
184
|
return useUseCase(defaultFile, fileUseCase);
|
|
@@ -630,10 +664,11 @@ describe('useUseCase', () => {
|
|
|
630
664
|
});
|
|
631
665
|
});
|
|
632
666
|
test('`options.watch` should work with array field path of array', () => {
|
|
667
|
+
const initialData = {};
|
|
633
668
|
const onExtChange = jest.fn();
|
|
634
669
|
const onSizeChange = jest.fn();
|
|
635
670
|
const { result } = renderHook(() => {
|
|
636
|
-
return useUseCase(
|
|
671
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
637
672
|
watch: {
|
|
638
673
|
'list.ext': onExtChange,
|
|
639
674
|
'list.size': onSizeChange,
|
|
@@ -884,9 +919,10 @@ describe('useUseCase', () => {
|
|
|
884
919
|
});
|
|
885
920
|
});
|
|
886
921
|
test('`options.watch` should work with field path of nested array', () => {
|
|
922
|
+
const initialData = {};
|
|
887
923
|
const onChange = jest.fn();
|
|
888
924
|
const { result } = renderHook(() => {
|
|
889
|
-
return useUseCase(
|
|
925
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
890
926
|
watch: {
|
|
891
927
|
'nestedList.size': onChange,
|
|
892
928
|
},
|
|
@@ -973,10 +1009,11 @@ describe('useUseCase', () => {
|
|
|
973
1009
|
});
|
|
974
1010
|
});
|
|
975
1011
|
test('`options.watch` should work with field path of object', () => {
|
|
1012
|
+
const initialData = {};
|
|
976
1013
|
const onExtChange = jest.fn();
|
|
977
1014
|
const onSizeChange = jest.fn();
|
|
978
1015
|
const { result } = renderHook(() => {
|
|
979
|
-
return useUseCase(
|
|
1016
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
980
1017
|
watch: {
|
|
981
1018
|
'obj.file.ext': onExtChange,
|
|
982
1019
|
'obj.file.size': onSizeChange,
|
|
@@ -1036,13 +1073,13 @@ describe('useUseCase', () => {
|
|
|
1036
1073
|
const onStringMount = jest.fn();
|
|
1037
1074
|
const onBooleanMount = jest.fn();
|
|
1038
1075
|
const numberUseCase = () => {
|
|
1039
|
-
return
|
|
1076
|
+
return entityUseCase();
|
|
1040
1077
|
};
|
|
1041
1078
|
const stringUseCase = () => {
|
|
1042
|
-
return
|
|
1079
|
+
return entityUseCase();
|
|
1043
1080
|
};
|
|
1044
1081
|
const booleanUseCase = () => {
|
|
1045
|
-
return
|
|
1082
|
+
return entityUseCase();
|
|
1046
1083
|
};
|
|
1047
1084
|
const TestChildComponent = () => {
|
|
1048
1085
|
const [numberValue] = useUseCase(numberUseCase);
|
|
@@ -1067,87 +1104,8 @@ describe('useUseCase', () => {
|
|
|
1067
1104
|
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
1068
1105
|
});
|
|
1069
1106
|
});
|
|
1070
|
-
describe('`useUseCase` should work the same as `ModeCoreCollectionHook`', () => {
|
|
1071
|
-
test.each(allModes)('[mode=%s]: check context type', (mode) => {
|
|
1072
|
-
const { result } = renderHook(() => {
|
|
1073
|
-
return useUseCase(defaultFile, fileUseCase, mode);
|
|
1074
|
-
});
|
|
1075
|
-
const { current: collection } = result;
|
|
1076
|
-
expect(Array.isArray(collection)).toBe(true);
|
|
1077
|
-
expect(collection).toHaveLength(3);
|
|
1078
|
-
});
|
|
1079
|
-
test('state controllable mode should return the entity state if initial entity has not changed', () => {
|
|
1080
|
-
const { result } = renderHook(() => {
|
|
1081
|
-
return useUseCase(defaultFile, fileUseCase, UseCaseModes.StateControllable);
|
|
1082
|
-
});
|
|
1083
|
-
const { current: collection } = result;
|
|
1084
|
-
const [, { setPath }] = collection;
|
|
1085
|
-
act(() => {
|
|
1086
|
-
setPath(PATH_1);
|
|
1087
|
-
});
|
|
1088
|
-
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_1, ext: EXT_1 });
|
|
1089
|
-
});
|
|
1090
|
-
test('state controllable mode should return the initial entity if initial entity has changed', () => {
|
|
1091
|
-
let file = defaultFile;
|
|
1092
|
-
const { result, rerender } = renderHook(() => {
|
|
1093
|
-
return useUseCase(file, fileUseCase, UseCaseModes.StateControllable);
|
|
1094
|
-
});
|
|
1095
|
-
file = { ...defaultFile, path: PATH_1 };
|
|
1096
|
-
rerender();
|
|
1097
|
-
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_1 });
|
|
1098
|
-
});
|
|
1099
|
-
test('state controllable mode should return the initial entity if initial entity has changed even with entity state changed', () => {
|
|
1100
|
-
let file = defaultFile;
|
|
1101
|
-
const { result } = renderHook(() => {
|
|
1102
|
-
return useUseCase(file, fileUseCase, UseCaseModes.StateControllable);
|
|
1103
|
-
});
|
|
1104
|
-
const { current: collection } = result;
|
|
1105
|
-
const [, { setPath }] = collection;
|
|
1106
|
-
act(() => {
|
|
1107
|
-
file = { ...defaultFile, path: PATH_2 };
|
|
1108
|
-
setPath(PATH_1);
|
|
1109
|
-
});
|
|
1110
|
-
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_2 });
|
|
1111
|
-
});
|
|
1112
|
-
test('stateless mode should not generate new reducers when `yeild entity`', () => {
|
|
1113
|
-
const onUpdate = jest.fn();
|
|
1114
|
-
const { result, rerender } = renderHook((file = defaultFile) => {
|
|
1115
|
-
useUpdateEffect(() => {
|
|
1116
|
-
onUpdate();
|
|
1117
|
-
});
|
|
1118
|
-
return useUseCase(file, fileUseCase, UseCaseModes.Stateless);
|
|
1119
|
-
});
|
|
1120
|
-
const { current: cores } = result;
|
|
1121
|
-
const [, { setPath }] = cores;
|
|
1122
|
-
setPath(PATH_1);
|
|
1123
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1124
|
-
expect(result.current[0].path).toBe('');
|
|
1125
|
-
expect(result.current[1].setPath).toBe(setPath);
|
|
1126
|
-
rerender({ ...defaultFile, path: PATH_1 });
|
|
1127
|
-
expect(result.current[0].path).toBe(PATH_1);
|
|
1128
|
-
expect(result.current[1].setPath).not.toBe(setPath);
|
|
1129
|
-
});
|
|
1130
|
-
test('stateless mode should not trigger update when after `yield entity`', () => {
|
|
1131
|
-
const onUpdate = jest.fn();
|
|
1132
|
-
const { result } = renderHook(() => {
|
|
1133
|
-
useUpdateEffect(() => {
|
|
1134
|
-
onUpdate();
|
|
1135
|
-
});
|
|
1136
|
-
return useUseCase(defaultFile, fileUseCase, UseCaseModes.Stateless);
|
|
1137
|
-
});
|
|
1138
|
-
const { current: cores } = result;
|
|
1139
|
-
const [, reducers] = cores;
|
|
1140
|
-
const { setPath } = reducers;
|
|
1141
|
-
act(() => {
|
|
1142
|
-
setPath(PATH_1);
|
|
1143
|
-
});
|
|
1144
|
-
expect(result.current).toBe(cores);
|
|
1145
|
-
expect(result.current).toEqual(cores);
|
|
1146
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1147
|
-
});
|
|
1148
|
-
});
|
|
1149
1107
|
describe('`useUseCase` should work the same as useContextualCoreCollection', () => {
|
|
1150
|
-
test
|
|
1108
|
+
test('Should trigger Parent & Child to update', () => {
|
|
1151
1109
|
const onParentUpdate = jest.fn();
|
|
1152
1110
|
const onChildUpdate = jest.fn();
|
|
1153
1111
|
const onPathChange = jest.fn();
|
|
@@ -1155,7 +1113,7 @@ describe('useUseCase', () => {
|
|
|
1155
1113
|
const onSetPath = jest.fn(() => {
|
|
1156
1114
|
return PATH_1;
|
|
1157
1115
|
});
|
|
1158
|
-
render(_jsx("div", { children: _jsx(Parent, {
|
|
1116
|
+
render(_jsx("div", { children: _jsx(Parent, { onSetPath: onSetPath, onUpdate: onParentUpdate, children: _jsx(Child, { onUpdate: onChildUpdate, onPathChange: onPathChange, onUndefinedEntity: onUndefinedEntity }) }) }));
|
|
1159
1117
|
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1160
1118
|
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1161
1119
|
expect(onParentUpdate).toHaveBeenCalledTimes(1);
|
|
@@ -1168,22 +1126,6 @@ describe('useUseCase', () => {
|
|
|
1168
1126
|
expect(onPathChange).toHaveBeenCalledWith(PATH_2);
|
|
1169
1127
|
expect(onUndefinedEntity).toHaveBeenCalledTimes(0);
|
|
1170
1128
|
});
|
|
1171
|
-
test.each([UseCaseModes.Stateless])('[mode=%s]: stateless mode should not trigger Parent & Child to update', () => {
|
|
1172
|
-
const onParentUpdate = jest.fn();
|
|
1173
|
-
const onChildUpdate = jest.fn();
|
|
1174
|
-
const onSetPath = jest.fn(() => {
|
|
1175
|
-
return PATH_1;
|
|
1176
|
-
});
|
|
1177
|
-
render(_jsx("div", { children: _jsx(Parent, { mode: UseCaseModes.Stateless, onSetPath: onSetPath, onUpdate: onParentUpdate, children: _jsx(Child, { onUpdate: onChildUpdate }) }) }));
|
|
1178
|
-
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1179
|
-
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1180
|
-
expect(onParentUpdate).toHaveBeenCalledTimes(0);
|
|
1181
|
-
expect(onChildUpdate).toHaveBeenCalledTimes(0);
|
|
1182
|
-
fireEvent.click(screen.getByText(CHILD_BUTTON_TEXT));
|
|
1183
|
-
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1184
|
-
expect(onParentUpdate).toHaveBeenCalledTimes(0);
|
|
1185
|
-
expect(onChildUpdate).toHaveBeenCalledTimes(0);
|
|
1186
|
-
});
|
|
1187
1129
|
test('`usecase` should not be called at child component', () => {
|
|
1188
1130
|
const mockUseCase = jest.fn(fileUseCase);
|
|
1189
1131
|
const A = () => {
|
|
@@ -1343,7 +1285,7 @@ describe('useUseCase', () => {
|
|
|
1343
1285
|
expect(onChangeB).toHaveReturnedWith(1);
|
|
1344
1286
|
expect(onChangeC).toHaveReturnedWith(3);
|
|
1345
1287
|
});
|
|
1346
|
-
test
|
|
1288
|
+
test('`options.onChange` should always trigger the latest one in child components', () => {
|
|
1347
1289
|
const onFirstChange = jest.fn();
|
|
1348
1290
|
const onSecondChange = jest.fn();
|
|
1349
1291
|
let onChange = onFirstChange;
|
|
@@ -1363,16 +1305,7 @@ describe('useUseCase', () => {
|
|
|
1363
1305
|
return (_jsxs(Fragment, { children: [_jsx("button", { onClick: onFirstClick, children: firstButtonText }), _jsx("button", { onClick: onSecondClick, children: secondButtonText })] }));
|
|
1364
1306
|
};
|
|
1365
1307
|
const B = () => {
|
|
1366
|
-
const [
|
|
1367
|
-
const [, , Provider] = useUseCase(file, fileUseCase, mode, {
|
|
1368
|
-
onChange(newFile) {
|
|
1369
|
-
if (mode !== UseCaseModes.Stateless) {
|
|
1370
|
-
return;
|
|
1371
|
-
}
|
|
1372
|
-
// `stateless` 不会保存状态,所以需要手动保存
|
|
1373
|
-
setFile(newFile);
|
|
1374
|
-
},
|
|
1375
|
-
});
|
|
1308
|
+
const [, , Provider] = useUseCase(defaultFile, fileUseCase);
|
|
1376
1309
|
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1377
1310
|
};
|
|
1378
1311
|
render(_jsx(B, {}));
|
|
@@ -1459,7 +1392,7 @@ describe('useUseCase', () => {
|
|
|
1459
1392
|
expect(onChangeB).toHaveReturnedWith(1);
|
|
1460
1393
|
expect(onChangeC).toHaveReturnedWith(3);
|
|
1461
1394
|
});
|
|
1462
|
-
test
|
|
1395
|
+
test('`options.watch` should trigger the latest one in child components', () => {
|
|
1463
1396
|
const onFirstExtChange = jest.fn();
|
|
1464
1397
|
const onSecondExtChange = jest.fn();
|
|
1465
1398
|
let onExtChange = onFirstExtChange;
|
|
@@ -1481,16 +1414,7 @@ describe('useUseCase', () => {
|
|
|
1481
1414
|
return (_jsxs(Fragment, { children: [_jsx("button", { onClick: onFirstClick, children: firstButtonText }), _jsx("button", { onClick: onSecondClick, children: secondButtonText })] }));
|
|
1482
1415
|
};
|
|
1483
1416
|
const B = () => {
|
|
1484
|
-
const [
|
|
1485
|
-
const [, , Provider] = useUseCase(file, fileUseCase, mode, {
|
|
1486
|
-
onChange(newFile) {
|
|
1487
|
-
if (mode !== UseCaseModes.Stateless) {
|
|
1488
|
-
return;
|
|
1489
|
-
}
|
|
1490
|
-
// `stateless` 不会保存状态,所以需要手动保存
|
|
1491
|
-
setFile(newFile);
|
|
1492
|
-
},
|
|
1493
|
-
});
|
|
1417
|
+
const [, , Provider] = useUseCase(defaultFile, fileUseCase);
|
|
1494
1418
|
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1495
1419
|
};
|
|
1496
1420
|
render(_jsx(B, {}));
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { EntityReducers, EntityUseCase, Reducers, UseCase } from '@mic-rexjs/usecases';
|
|
2
2
|
import { UseCaseProvider } from '../useProvider/types';
|
|
3
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
4
3
|
import { ContextualEntityReducers } from '../../configs/defaultUseCaseContext/types';
|
|
5
4
|
import { SymbolSet, SymbolSetTarget } from '@mic-rexjs/usecases/es/types';
|
|
6
5
|
export interface NonEntitySymbolSet extends SymbolSet {
|
|
@@ -54,11 +53,8 @@ export interface ContextualCoreCollectionHook {
|
|
|
54
53
|
export interface RootCoreCollectionHook {
|
|
55
54
|
<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object>(entity: T | EntityGetter<T>, usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions> & UseCase<EntityReducers<T>, TUseCaseOptions>, options?: UseCaseHookOptions<T, TUseCaseOptions>, deps?: unknown[]): RootCoreCollection<T, TEntityReducers>;
|
|
56
55
|
}
|
|
57
|
-
export interface
|
|
58
|
-
<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object>(entity: T | EntityGetter<T>, usecase: EntityUseCase<T, TEntityReducers, TUseCaseOptions> & UseCase<EntityReducers<T>, TUseCaseOptions>, mode: UseCaseModes, options?: UseCaseHookOptions<T, TUseCaseOptions>, deps?: unknown[]): RootCoreCollection<T, TEntityReducers>;
|
|
56
|
+
export interface CoreCollectionHook extends ContextualCoreCollectionHook, RootCoreCollectionHook {
|
|
59
57
|
}
|
|
60
|
-
export
|
|
61
|
-
}
|
|
62
|
-
export type UseCaseHookParameters = Parameters<ReducersHook> | Parameters<ContextualCoreCollectionHook> | Parameters<RootCoreCollectionHook> | Parameters<ModeCoreCollectionHook>;
|
|
58
|
+
export type UseCaseHookParameters = Parameters<ReducersHook> | Parameters<ContextualCoreCollectionHook> | Parameters<RootCoreCollectionHook>;
|
|
63
59
|
export interface UseCaseHook extends ReducersHook, CoreCollectionHook {
|
|
64
60
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { UseCaseContextValue } from '../../configs/defaultUseCaseContext/types';
|
|
2
2
|
import { UseCaseArgumentTypes } from '../../enums/UseCaseArgumentTypes';
|
|
3
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
4
3
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
5
4
|
import { Reducers } from '@mic-rexjs/usecases';
|
|
6
|
-
export declare const useUseCaseStatuses: <T extends Reducers>(argumentTypes: UseCaseArgumentTypes,
|
|
5
|
+
export declare const useUseCaseStatuses: <T extends Reducers>(argumentTypes: UseCaseArgumentTypes, contextValue: UseCaseContextValue<T> | null) => UseCaseStatuses;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { UseCaseArgumentTypes } from '../../enums/UseCaseArgumentTypes';
|
|
2
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
3
2
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
4
3
|
import { useCreation } from 'ahooks';
|
|
5
|
-
export const useUseCaseStatuses = (argumentTypes,
|
|
4
|
+
export const useUseCaseStatuses = (argumentTypes, contextValue) => {
|
|
6
5
|
return useCreation(() => {
|
|
7
6
|
let statuses = UseCaseStatuses.None;
|
|
8
7
|
const { store } = (contextValue || {});
|
|
@@ -18,14 +17,6 @@ export const useUseCaseStatuses = (argumentTypes, mode, contextValue) => {
|
|
|
18
17
|
if (store) {
|
|
19
18
|
statuses |= UseCaseStatuses.EntityEnabled;
|
|
20
19
|
}
|
|
21
|
-
switch (mode) {
|
|
22
|
-
case UseCaseModes.StateControllable:
|
|
23
|
-
statuses |= UseCaseStatuses.StateControllableEnabled;
|
|
24
|
-
break;
|
|
25
|
-
case UseCaseModes.Stateless:
|
|
26
|
-
statuses |= UseCaseStatuses.StatelessEnabled;
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
20
|
return statuses;
|
|
30
|
-
}, [argumentTypes, contextValue
|
|
21
|
+
}, [argumentTypes, contextValue]);
|
|
31
22
|
};
|
package/es/index.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export { UseCaseFragment } from './components/UseCaseFragment';
|
|
2
2
|
export { useUseCase } from './hooks/useUseCase';
|
|
3
|
-
export { useStateControllableUseCase } from './hooks/useStateControllableUseCase';
|
|
4
|
-
export { useStatelessUseCase } from './hooks/useStatelessUseCase';
|
|
5
3
|
export type { EntityWatchEvent, RootCoreCollection, ContextualCoreCollection, CoreCollection, } from './hooks/useUseCase/types';
|
|
6
4
|
export type { UseCaseHookOptions } from './hooks/useUseCase/types';
|
|
7
5
|
export type { UseCaseProvider } from './hooks/useProvider/types';
|
package/es/index.js
CHANGED
|
@@ -1,32 +1,14 @@
|
|
|
1
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
2
1
|
import { UseCaseArgumentTypes } from '../../enums/UseCaseArgumentTypes';
|
|
3
2
|
export const fillArguments = (args, argumentTypes) => {
|
|
4
|
-
const [arg1, arg2, arg3, arg4
|
|
3
|
+
const [arg1, arg2, arg3, arg4] = args;
|
|
5
4
|
const hasEntity = (argumentTypes & UseCaseArgumentTypes.Entity) === UseCaseArgumentTypes.Entity;
|
|
6
|
-
const hasMode = (argumentTypes & UseCaseArgumentTypes.Mode) === UseCaseArgumentTypes.Mode;
|
|
7
5
|
if (hasEntity) {
|
|
8
|
-
if (hasMode) {
|
|
9
|
-
return [
|
|
10
|
-
arg1,
|
|
11
|
-
arg2,
|
|
12
|
-
arg3,
|
|
13
|
-
(arg4 || {}),
|
|
14
|
-
arg5 || [],
|
|
15
|
-
];
|
|
16
|
-
}
|
|
17
6
|
return [
|
|
18
7
|
arg1,
|
|
19
8
|
arg2,
|
|
20
|
-
UseCaseModes.Normal,
|
|
21
9
|
(arg3 || {}),
|
|
22
10
|
(arg4 || []),
|
|
23
11
|
];
|
|
24
12
|
}
|
|
25
|
-
return [
|
|
26
|
-
null,
|
|
27
|
-
arg1,
|
|
28
|
-
UseCaseModes.Normal,
|
|
29
|
-
(arg2 || {}),
|
|
30
|
-
(arg3 || []),
|
|
31
|
-
];
|
|
13
|
+
return [null, arg1, (arg2 || {}), (arg3 || [])];
|
|
32
14
|
};
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import { UseCaseModes } from '../../enums/UseCaseModes';
|
|
2
1
|
import { EntityGetter, UseCaseHookContextualOptions, UseCaseHookOptions } from '../../hooks/useUseCase/types';
|
|
3
2
|
import { EntityReducers, EntityUseCase, Reducers, UseCase } from '@mic-rexjs/usecases';
|
|
4
3
|
export type UseCaseHookFullParameters<T, TReducers extends Reducers, TUseCaseOptions extends object> = [
|
|
5
4
|
entity: T | EntityGetter<T>,
|
|
6
5
|
usecase: UseCase<TReducers, TUseCaseOptions> | EntityUseCase<T, TReducers & EntityReducers<T>, TUseCaseOptions>,
|
|
7
|
-
mode: UseCaseModes,
|
|
8
6
|
options: TUseCaseOptions | UseCaseHookOptions<T, TUseCaseOptions> | UseCaseHookContextualOptions<T>,
|
|
9
7
|
deps: unknown[]
|
|
10
8
|
];
|
|
@@ -8,5 +8,4 @@ var UseCaseArgumentTypes;
|
|
|
8
8
|
(function (UseCaseArgumentTypes) {
|
|
9
9
|
UseCaseArgumentTypes[UseCaseArgumentTypes["None"] = 0] = "None";
|
|
10
10
|
UseCaseArgumentTypes[UseCaseArgumentTypes["Entity"] = 2] = "Entity";
|
|
11
|
-
UseCaseArgumentTypes[UseCaseArgumentTypes["Mode"] = 4] = "Mode";
|
|
12
11
|
})(UseCaseArgumentTypes || (exports.UseCaseArgumentTypes = UseCaseArgumentTypes = {}));
|
|
@@ -17,8 +17,4 @@ var UseCaseStatuses;
|
|
|
17
17
|
UseCaseStatuses[UseCaseStatuses["ContextRootEnabled"] = 22] = "ContextRootEnabled";
|
|
18
18
|
// 是否初始化与 `entity` 相关的 `reducers`
|
|
19
19
|
UseCaseStatuses[UseCaseStatuses["EntityRootEnabled"] = 62] = "EntityRootEnabled";
|
|
20
|
-
// 是否为 `entity` 状态可控
|
|
21
|
-
UseCaseStatuses[UseCaseStatuses["StateControllableEnabled"] = 72] = "StateControllableEnabled";
|
|
22
|
-
// 是否不需要 `entity` 状态管理
|
|
23
|
-
UseCaseStatuses[UseCaseStatuses["StatelessEnabled"] = 136] = "StatelessEnabled";
|
|
24
20
|
})(UseCaseStatuses || (exports.UseCaseStatuses = UseCaseStatuses = {}));
|