@mic-rexjs/usecases-react 2.3.6 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/es/enums/UseCaseArgumentTypes/index.d.ts +1 -2
- package/es/enums/UseCaseArgumentTypes/index.js +0 -1
- package/es/enums/UseCaseStatuses/index.d.ts +1 -2
- package/es/enums/UseCaseStatuses/index.js +0 -2
- package/es/hooks/useArgumentTypes/index.js +1 -4
- package/es/hooks/useEntity/index.js +6 -10
- package/es/hooks/useRuntimeEntity/index.d.ts +3 -0
- package/es/hooks/useRuntimeEntity/index.js +18 -0
- package/es/hooks/useUseCase/index.js +2 -2
- package/es/hooks/useUseCase/index.test.js +50 -95
- 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 -6
- package/es/index.d.ts +0 -1
- package/es/index.js +0 -1
- 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 -2
- package/lib/hooks/useArgumentTypes/index.js +2 -6
- package/lib/hooks/useEntity/index.js +6 -10
- package/lib/hooks/useRuntimeEntity/index.js +24 -0
- package/lib/hooks/useUseCase/index.js +4 -5
- package/lib/hooks/useUseCase/index.test.js +124 -179
- package/lib/hooks/useUseCaseStatuses/index.js +2 -6
- package/lib/index.js +1 -8
- package/lib/methods/fillArguments/index.js +4 -10
- package/package.json +2 -2
- package/es/enums/UseCaseModes/index.d.ts +0 -4
- package/es/enums/UseCaseModes/index.js +0 -5
- 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/es/methods/getRenderingEntity/index.d.ts +0 -3
- package/es/methods/getRenderingEntity/index.js +0 -13
- package/lib/enums/UseCaseModes/index.js +0 -11
- 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/lib/methods/getRenderingEntity/index.js +0 -19
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"),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,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)u.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: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:()=>A,useStatelessUseCase:()=>M,useUseCase:()=>x});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 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,u,a,i=[],l=!0,c=!1;try{if(u=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=u.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&&(a=n.return(),Object(a)!==a))return}finally{if(c)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 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 d(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.StatelessEnabled=72]="StatelessEnabled"}(f||(f={}));const v=usecases;var b=["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,u;r=t,o=e,u=n[e],(o=d(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)):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=2]="Normal",t[t.Stateless=4]="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},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 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}},C=function(t,e,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=(0,c.useLatest)(n),u=(0,c.useCreation)((function(){return j(o.current,{onCompare:function(){return!0}})}),[r,o]);return(0,c.useCreation)((function(){return(e&f.RootEnabled)!==f.RootEnabled&&t?t:u()}),[e,t,u])},R=function(t,e){return"object"===y(t)&&null!==t&&Object.hasOwn(t,e)},P=function t(e,n,r,o){var u=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],a=void 0,c=l(r.match(/^([^.]+)\.(.+)$/)||[],3),f=c[1],s=void 0===f?r:f,y=c[2],d=void 0===y?"":y,v=R(e,s),b=R(n,s),E=[].concat(i(u),[s]);if(v||b){var p=v?e[s]:a,m=b?n[s]:a;if(d)return void t(p,m,d,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),j=0;j<w;j++)t(h[j],S[j],r,o,[].concat(i(u),["".concat(j)]))},_=function(t,e,n){for(var r=function(){var t=l(u[o],2),r=t[0],a=t[1];P(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()},x=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 d=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}))}(u),E=function(t,e){var n=l(t,5),r=n[0],o=n[1],u=n[2],a=n[3],i=n[4],c=(e&m.Entity)===m.Entity,f=(e&m.Mode)===m.Mode;return c?f?[r,o,u,a||{},i||[]]:[r,o,g.Normal,u||{},a||[]]:[null,r,g.Normal,o||{},u||[]]}(u,d),R=l(E,5),P=R[0],x=R[1],A=R[2],M=R[3],N=R[4],I=s(x),k=I,T=I,L=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),u=o.value,a=o.times;return r.set(t,{value:u,times:a+1}),u}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,u=e.times;o===n&&(1!==u?r.set(t,{value:n,times:u-1}):r.delete(t))}})),o}(I,d),U=(0,e.useContext)(L),D=U,V=function(t,e,n){return(0,c.useCreation)((function(){var r=f.None,o=(n||{}).store;return(t&m.Entity)===m.Entity&&(r|=f.EntityRootEnabled),r|=n?f.ContextEnabled:f.RootEnabled,o&&(r|=f.EntityEnabled),(e&g.Stateless)===g.Stateless&&(r|=f.StatelessEnabled),r}),[t,n,e])}(d,A,U),$=(0,c.useLatest)(M),F=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}(N),B=(U||{}).reducers,G=void 0===B?null:B,W=(D||{}).store,Y=l(function(t,n,r,o,u){var a=l((0,e.useState)(n),2),i=a[0],s=a[1],y=r?r.value:null,d=function(t,e,n,r){return(t&f.EntityRootEnabled)!==f.EntityRootEnabled?r:(t&f.StatelessEnabled)!==f.StatelessEnabled?e:"function"==typeof n?n():n}(t,i,n,y),b=(t&f.EntityEnabled)===f.EntityEnabled,E=(t&f.EntityRootEnabled)===f.EntityRootEnabled,p=(0,c.useLatest)(o),m=C(r,t,(function(){if(!E)return new v.EntityStore(null);var e=(t&f.StatelessEnabled)===f.StatelessEnabled;return new v.EntityStore(d,{onChange:function(t){e||s(t)}})}));return E&&(m.value=d),(0,e.useEffect)((function(){if(b){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)}}}),[b,m,u,p]),(0,c.useCreation)((function(){return[d,m]}),[d,m])}(V,P,void 0===W?null:W,M,F),2),q=Y[0],z=Y[1],H=C(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?k(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,v.createEntityReducers)(e,t,p(p(p({},o),r),{},{onGenerate:function(t,e){return e}}))}(T,z,r)}),F),J=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]),l=(0,c.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:l.current},u.reduceRight((function(t,e){return o().createElement(e,{},t)}),e))}))}(V,L,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],u=r[1];n[o]=j(u,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,u=n.onChange;return x(r,{watch:o,onChange:u}),(0,t.jsx)(e.Fragment,{})},M=function(t,e,n,r){return x(t,e,g.Stateless,n,r)}})();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
|
+
(()=>{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,D=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),U=(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=c((0,e.useState)(n),2),i=a[0],s=a[1],y=function(t,n,r,o){var u=(0,e.useRef)(r);if((t&f.EntityRootEnabled)!==f.EntityRootEnabled)return o;var a="function"==typeof r,i=u.current;switch(!0){case a:case i===r:return n}return u.current=r,r}(t,i,n,r?r.value:null),v=(t&f.EntityEnabled)===f.EntityEnabled,b=(t&f.EntityRootEnabled)===f.EntityRootEnabled,p=(0,l.useLatest)(o),E=S(r,t,(function(){return b?new d.EntityStore(y,{onChange:function(t){s(t)}}):new d.EntityStore(null)}));return b&&(E.value=y),(0,e.useEffect)((function(){if(v){var t=function(t,e){var n=p.current,r=n.onChange,o=n.watch;o&&P(o,t,e),null==r||r(t,e)};return E.watch(t),function(){E.unwatch(t)}}}),[v,E,u,p]),(0,l.useCreation)((function(){return[y,E]}),[y,E])}(D,R,void 0===B?null:B,x,V),2),W=G[0],Y=G[1],q=S(F,D,(function(){var t,e,n,r=(t=x,e=function(t,e){var n,r;return null===(n=(r=U.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(D&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))}))}(D,k,Y,q);return(0,l.useCreation)((function(){if((D&f.EntityEnabled)!==f.EntityEnabled)return q;var t=(D&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]}),[D,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,6 +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["StatelessEnabled"] = 72] = "StatelessEnabled";
|
|
16
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,14 +1,14 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
2
|
import { EntityStore } from '@mic-rexjs/usecases';
|
|
3
3
|
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
4
|
-
import { getRenderingEntity } from '../../methods/getRenderingEntity';
|
|
5
4
|
import { useContextualItem } from '../useContextualItem';
|
|
6
5
|
import { useCreation, useLatest } from 'ahooks';
|
|
7
6
|
import { triggerWatchers } from '../../methods/triggerWatchers';
|
|
7
|
+
import { useRuntimeEntity } from '../useRuntimeEntity';
|
|
8
8
|
export const useEntity = (statuses, rootEntity, contextStore, options, depsKey) => {
|
|
9
9
|
const [entityState, setEntityState] = useState(rootEntity);
|
|
10
10
|
const contextEntity = (contextStore ? contextStore.value : null);
|
|
11
|
-
const
|
|
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
14
|
const optionsRef = useLatest(options);
|
|
@@ -16,19 +16,15 @@ export const useEntity = (statuses, rootEntity, contextStore, options, depsKey)
|
|
|
16
16
|
if (!entityRootEnabled) {
|
|
17
17
|
return new EntityStore(null);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
return new EntityStore(renderingEntity, {
|
|
19
|
+
return new EntityStore(runtimeEntity, {
|
|
21
20
|
onChange(newEntity) {
|
|
22
|
-
if (stateless) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
21
|
setEntityState(newEntity);
|
|
26
22
|
},
|
|
27
23
|
});
|
|
28
24
|
});
|
|
29
25
|
if (entityRootEnabled) {
|
|
30
26
|
// 执行同步操作
|
|
31
|
-
store.value =
|
|
27
|
+
store.value = runtimeEntity;
|
|
32
28
|
}
|
|
33
29
|
useEffect(() => {
|
|
34
30
|
if (!entityEnabled) {
|
|
@@ -47,6 +43,6 @@ export const useEntity = (statuses, rootEntity, contextStore, options, depsKey)
|
|
|
47
43
|
};
|
|
48
44
|
}, [entityEnabled, store, depsKey, optionsRef]);
|
|
49
45
|
return useCreation(() => {
|
|
50
|
-
return [
|
|
51
|
-
}, [
|
|
46
|
+
return [runtimeEntity, store];
|
|
47
|
+
}, [runtimeEntity, store]);
|
|
52
48
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { UseCaseStatuses } from '../../enums/UseCaseStatuses';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
export const useRuntimeEntity = (statuses, entityState, rootEntity, contextEntity) => {
|
|
4
|
+
const prevRootEntityRef = useRef(rootEntity);
|
|
5
|
+
const entityRootDisabled = (statuses & UseCaseStatuses.EntityRootEnabled) !== UseCaseStatuses.EntityRootEnabled;
|
|
6
|
+
if (entityRootDisabled) {
|
|
7
|
+
return contextEntity;
|
|
8
|
+
}
|
|
9
|
+
const isFunction = typeof rootEntity === 'function';
|
|
10
|
+
const { current: prevRootEntity } = prevRootEntityRef;
|
|
11
|
+
switch (true) {
|
|
12
|
+
case isFunction:
|
|
13
|
+
case prevRootEntity === rootEntity:
|
|
14
|
+
return entityState;
|
|
15
|
+
}
|
|
16
|
+
prevRootEntityRef.current = rootEntity;
|
|
17
|
+
return rootEntity;
|
|
18
|
+
};
|
|
@@ -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,7 +5,6 @@ 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}`;
|
|
@@ -89,8 +88,8 @@ const Child = ({ textPrefix = '', onUpdate, onPathChange, onUndefinedEntity }) =
|
|
|
89
88
|
useUpdateEffect(pathChange, [path, pathChange]);
|
|
90
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 }) })] }));
|
|
91
90
|
};
|
|
92
|
-
const Parent = ({ children,
|
|
93
|
-
const [{ path, ext }, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase
|
|
91
|
+
const Parent = ({ children, onUpdate, onSetPath }) => {
|
|
92
|
+
const [{ path, ext }, { setPath }, Provider] = useUseCase(defaultFile, fileUseCase);
|
|
94
93
|
const onClick = () => {
|
|
95
94
|
setPath(onSetPath?.() || '');
|
|
96
95
|
};
|
|
@@ -144,6 +143,39 @@ describe('useUseCase', () => {
|
|
|
144
143
|
const [entity] = cores;
|
|
145
144
|
expect(entity).toBe(defaultFile);
|
|
146
145
|
});
|
|
146
|
+
test('Should return the entity state if initial 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 initial entity if initial entity has changed', () => {
|
|
158
|
+
let file = defaultFile;
|
|
159
|
+
const { result, rerender } = renderHook(() => {
|
|
160
|
+
return useUseCase(file, fileUseCase);
|
|
161
|
+
});
|
|
162
|
+
file = { ...defaultFile, path: PATH_1 };
|
|
163
|
+
rerender();
|
|
164
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_1 });
|
|
165
|
+
});
|
|
166
|
+
test('Should return the initial entity if initial entity has changed even with entity state changed', () => {
|
|
167
|
+
let file = defaultFile;
|
|
168
|
+
const { result } = renderHook(() => {
|
|
169
|
+
return useUseCase(file, fileUseCase);
|
|
170
|
+
});
|
|
171
|
+
const { current: collection } = result;
|
|
172
|
+
const [, { setPath }] = collection;
|
|
173
|
+
act(() => {
|
|
174
|
+
file = { ...defaultFile, path: PATH_2 };
|
|
175
|
+
setPath(PATH_1);
|
|
176
|
+
});
|
|
177
|
+
expect(result.current[0]).toEqual({ ...defaultFile, path: PATH_2 });
|
|
178
|
+
});
|
|
147
179
|
test('`reducers` should be returned as an object', () => {
|
|
148
180
|
const { result } = renderHook(() => {
|
|
149
181
|
return useUseCase(defaultFile, fileUseCase);
|
|
@@ -629,10 +661,11 @@ describe('useUseCase', () => {
|
|
|
629
661
|
});
|
|
630
662
|
});
|
|
631
663
|
test('`options.watch` should work with array field path of array', () => {
|
|
664
|
+
const initialData = {};
|
|
632
665
|
const onExtChange = jest.fn();
|
|
633
666
|
const onSizeChange = jest.fn();
|
|
634
667
|
const { result } = renderHook(() => {
|
|
635
|
-
return useUseCase(
|
|
668
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
636
669
|
watch: {
|
|
637
670
|
'list.ext': onExtChange,
|
|
638
671
|
'list.size': onSizeChange,
|
|
@@ -883,9 +916,10 @@ describe('useUseCase', () => {
|
|
|
883
916
|
});
|
|
884
917
|
});
|
|
885
918
|
test('`options.watch` should work with field path of nested array', () => {
|
|
919
|
+
const initialData = {};
|
|
886
920
|
const onChange = jest.fn();
|
|
887
921
|
const { result } = renderHook(() => {
|
|
888
|
-
return useUseCase(
|
|
922
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
889
923
|
watch: {
|
|
890
924
|
'nestedList.size': onChange,
|
|
891
925
|
},
|
|
@@ -972,10 +1006,11 @@ describe('useUseCase', () => {
|
|
|
972
1006
|
});
|
|
973
1007
|
});
|
|
974
1008
|
test('`options.watch` should work with field path of object', () => {
|
|
1009
|
+
const initialData = {};
|
|
975
1010
|
const onExtChange = jest.fn();
|
|
976
1011
|
const onSizeChange = jest.fn();
|
|
977
1012
|
const { result } = renderHook(() => {
|
|
978
|
-
return useUseCase(
|
|
1013
|
+
return useUseCase(initialData, fieldPathUseCase, {
|
|
979
1014
|
watch: {
|
|
980
1015
|
'obj.file.ext': onExtChange,
|
|
981
1016
|
'obj.file.size': onSizeChange,
|
|
@@ -1035,13 +1070,13 @@ describe('useUseCase', () => {
|
|
|
1035
1070
|
const onStringMount = jest.fn();
|
|
1036
1071
|
const onBooleanMount = jest.fn();
|
|
1037
1072
|
const numberUseCase = () => {
|
|
1038
|
-
return
|
|
1073
|
+
return entityUseCase();
|
|
1039
1074
|
};
|
|
1040
1075
|
const stringUseCase = () => {
|
|
1041
|
-
return
|
|
1076
|
+
return entityUseCase();
|
|
1042
1077
|
};
|
|
1043
1078
|
const booleanUseCase = () => {
|
|
1044
|
-
return
|
|
1079
|
+
return entityUseCase();
|
|
1045
1080
|
};
|
|
1046
1081
|
const TestChildComponent = () => {
|
|
1047
1082
|
const [numberValue] = useUseCase(numberUseCase);
|
|
@@ -1066,54 +1101,8 @@ describe('useUseCase', () => {
|
|
|
1066
1101
|
expect(onBooleanMount).toHaveBeenCalledWith(true);
|
|
1067
1102
|
});
|
|
1068
1103
|
});
|
|
1069
|
-
describe('`useUseCase` should work the same as `ModeCoreCollectionHook`', () => {
|
|
1070
|
-
test.each([UseCaseModes.Normal, UseCaseModes.Stateless])('[mode=%s]: check context type', (mode) => {
|
|
1071
|
-
const { result } = renderHook(() => {
|
|
1072
|
-
return useUseCase(defaultFile, fileUseCase, mode);
|
|
1073
|
-
});
|
|
1074
|
-
const { current: cores } = result;
|
|
1075
|
-
expect(Array.isArray(cores)).toBe(true);
|
|
1076
|
-
expect(cores).toHaveLength(3);
|
|
1077
|
-
});
|
|
1078
|
-
test('stateless mode should not generate new reducers when `yeild entity`', () => {
|
|
1079
|
-
const onUpdate = jest.fn();
|
|
1080
|
-
const { result, rerender } = renderHook((file = defaultFile) => {
|
|
1081
|
-
useUpdateEffect(() => {
|
|
1082
|
-
onUpdate();
|
|
1083
|
-
});
|
|
1084
|
-
return useUseCase(file, fileUseCase, UseCaseModes.Stateless);
|
|
1085
|
-
});
|
|
1086
|
-
const { current: cores } = result;
|
|
1087
|
-
const [, { setPath }] = cores;
|
|
1088
|
-
setPath(PATH_1);
|
|
1089
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1090
|
-
expect(result.current[0].path).toBe('');
|
|
1091
|
-
expect(result.current[1].setPath).toBe(setPath);
|
|
1092
|
-
rerender({ ...defaultFile, path: PATH_1 });
|
|
1093
|
-
expect(result.current[0].path).toBe(PATH_1);
|
|
1094
|
-
expect(result.current[1].setPath).not.toBe(setPath);
|
|
1095
|
-
});
|
|
1096
|
-
test('stateless mode should not trigger update when after `yield entity`', () => {
|
|
1097
|
-
const onUpdate = jest.fn();
|
|
1098
|
-
const { result } = renderHook(() => {
|
|
1099
|
-
useUpdateEffect(() => {
|
|
1100
|
-
onUpdate();
|
|
1101
|
-
});
|
|
1102
|
-
return useUseCase(defaultFile, fileUseCase, UseCaseModes.Stateless);
|
|
1103
|
-
});
|
|
1104
|
-
const { current: cores } = result;
|
|
1105
|
-
const [, reducers] = cores;
|
|
1106
|
-
const { setPath } = reducers;
|
|
1107
|
-
act(() => {
|
|
1108
|
-
setPath(PATH_1);
|
|
1109
|
-
});
|
|
1110
|
-
expect(result.current).toBe(cores);
|
|
1111
|
-
expect(result.current).toEqual(cores);
|
|
1112
|
-
expect(onUpdate).toHaveBeenCalledTimes(0);
|
|
1113
|
-
});
|
|
1114
|
-
});
|
|
1115
1104
|
describe('`useUseCase` should work the same as useContextualCoreCollection', () => {
|
|
1116
|
-
test
|
|
1105
|
+
test('Should trigger Parent & Child to update', () => {
|
|
1117
1106
|
const onParentUpdate = jest.fn();
|
|
1118
1107
|
const onChildUpdate = jest.fn();
|
|
1119
1108
|
const onPathChange = jest.fn();
|
|
@@ -1121,7 +1110,7 @@ describe('useUseCase', () => {
|
|
|
1121
1110
|
const onSetPath = jest.fn(() => {
|
|
1122
1111
|
return PATH_1;
|
|
1123
1112
|
});
|
|
1124
|
-
render(_jsx("div", { children: _jsx(Parent, {
|
|
1113
|
+
render(_jsx("div", { children: _jsx(Parent, { onSetPath: onSetPath, onUpdate: onParentUpdate, children: _jsx(Child, { onUpdate: onChildUpdate, onPathChange: onPathChange, onUndefinedEntity: onUndefinedEntity }) }) }));
|
|
1125
1114
|
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1126
1115
|
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1127
1116
|
expect(onParentUpdate).toHaveBeenCalledTimes(1);
|
|
@@ -1134,22 +1123,6 @@ describe('useUseCase', () => {
|
|
|
1134
1123
|
expect(onPathChange).toHaveBeenCalledWith(PATH_2);
|
|
1135
1124
|
expect(onUndefinedEntity).toHaveBeenCalledTimes(0);
|
|
1136
1125
|
});
|
|
1137
|
-
test.each([UseCaseModes.Stateless])('[mode=%s]: stateless mode should not trigger Parent & Child to update', () => {
|
|
1138
|
-
const onParentUpdate = jest.fn();
|
|
1139
|
-
const onChildUpdate = jest.fn();
|
|
1140
|
-
const onSetPath = jest.fn(() => {
|
|
1141
|
-
return PATH_1;
|
|
1142
|
-
});
|
|
1143
|
-
render(_jsx("div", { children: _jsx(Parent, { mode: UseCaseModes.Stateless, onSetPath: onSetPath, onUpdate: onParentUpdate, children: _jsx(Child, { onUpdate: onChildUpdate }) }) }));
|
|
1144
|
-
fireEvent.click(screen.getByText(PARENT_BUTTON_TEXT));
|
|
1145
|
-
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1146
|
-
expect(onParentUpdate).toHaveBeenCalledTimes(0);
|
|
1147
|
-
expect(onChildUpdate).toHaveBeenCalledTimes(0);
|
|
1148
|
-
fireEvent.click(screen.getByText(CHILD_BUTTON_TEXT));
|
|
1149
|
-
expect(onSetPath).toHaveBeenCalledTimes(1);
|
|
1150
|
-
expect(onParentUpdate).toHaveBeenCalledTimes(0);
|
|
1151
|
-
expect(onChildUpdate).toHaveBeenCalledTimes(0);
|
|
1152
|
-
});
|
|
1153
1126
|
test('`usecase` should not be called at child component', () => {
|
|
1154
1127
|
const mockUseCase = jest.fn(fileUseCase);
|
|
1155
1128
|
const A = () => {
|
|
@@ -1309,7 +1282,7 @@ describe('useUseCase', () => {
|
|
|
1309
1282
|
expect(onChangeB).toHaveReturnedWith(1);
|
|
1310
1283
|
expect(onChangeC).toHaveReturnedWith(3);
|
|
1311
1284
|
});
|
|
1312
|
-
test
|
|
1285
|
+
test('`options.onChange` should always trigger the latest one in child components', () => {
|
|
1313
1286
|
const onFirstChange = jest.fn();
|
|
1314
1287
|
const onSecondChange = jest.fn();
|
|
1315
1288
|
let onChange = onFirstChange;
|
|
@@ -1329,16 +1302,7 @@ describe('useUseCase', () => {
|
|
|
1329
1302
|
return (_jsxs(Fragment, { children: [_jsx("button", { onClick: onFirstClick, children: firstButtonText }), _jsx("button", { onClick: onSecondClick, children: secondButtonText })] }));
|
|
1330
1303
|
};
|
|
1331
1304
|
const B = () => {
|
|
1332
|
-
const [
|
|
1333
|
-
const [, , Provider] = useUseCase(file, fileUseCase, mode, {
|
|
1334
|
-
onChange(newFile) {
|
|
1335
|
-
if ((mode & UseCaseModes.Stateless) !== UseCaseModes.Stateless) {
|
|
1336
|
-
return;
|
|
1337
|
-
}
|
|
1338
|
-
// `stateless` 不会保存状态,所以需要手动保存
|
|
1339
|
-
setFile(newFile);
|
|
1340
|
-
},
|
|
1341
|
-
});
|
|
1305
|
+
const [, , Provider] = useUseCase(defaultFile, fileUseCase);
|
|
1342
1306
|
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1343
1307
|
};
|
|
1344
1308
|
render(_jsx(B, {}));
|
|
@@ -1425,7 +1389,7 @@ describe('useUseCase', () => {
|
|
|
1425
1389
|
expect(onChangeB).toHaveReturnedWith(1);
|
|
1426
1390
|
expect(onChangeC).toHaveReturnedWith(3);
|
|
1427
1391
|
});
|
|
1428
|
-
test
|
|
1392
|
+
test('`options.watch` should trigger the latest one in child components', () => {
|
|
1429
1393
|
const onFirstExtChange = jest.fn();
|
|
1430
1394
|
const onSecondExtChange = jest.fn();
|
|
1431
1395
|
let onExtChange = onFirstExtChange;
|
|
@@ -1447,16 +1411,7 @@ describe('useUseCase', () => {
|
|
|
1447
1411
|
return (_jsxs(Fragment, { children: [_jsx("button", { onClick: onFirstClick, children: firstButtonText }), _jsx("button", { onClick: onSecondClick, children: secondButtonText })] }));
|
|
1448
1412
|
};
|
|
1449
1413
|
const B = () => {
|
|
1450
|
-
const [
|
|
1451
|
-
const [, , Provider] = useUseCase(file, fileUseCase, mode, {
|
|
1452
|
-
onChange(newFile) {
|
|
1453
|
-
if ((mode & UseCaseModes.Stateless) !== UseCaseModes.Stateless) {
|
|
1454
|
-
return;
|
|
1455
|
-
}
|
|
1456
|
-
// `stateless` 不会保存状态,所以需要手动保存
|
|
1457
|
-
setFile(newFile);
|
|
1458
|
-
},
|
|
1459
|
-
});
|
|
1414
|
+
const [, , Provider] = useUseCase(defaultFile, fileUseCase);
|
|
1460
1415
|
return (_jsx(Provider, { children: _jsx(A, {}) }));
|
|
1461
1416
|
};
|
|
1462
1417
|
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,9 +17,6 @@ export const useUseCaseStatuses = (argumentTypes, mode, contextValue) => {
|
|
|
18
17
|
if (store) {
|
|
19
18
|
statuses |= UseCaseStatuses.EntityEnabled;
|
|
20
19
|
}
|
|
21
|
-
if ((mode & UseCaseModes.Stateless) === UseCaseModes.Stateless) {
|
|
22
|
-
statuses |= UseCaseStatuses.StatelessEnabled;
|
|
23
|
-
}
|
|
24
20
|
return statuses;
|
|
25
|
-
}, [argumentTypes, contextValue
|
|
21
|
+
}, [argumentTypes, contextValue]);
|
|
26
22
|
};
|
package/es/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { UseCaseFragment } from './components/UseCaseFragment';
|
|
2
2
|
export { useUseCase } from './hooks/useUseCase';
|
|
3
|
-
export { useStatelessUseCase } from './hooks/useStatelessUseCase';
|
|
4
3
|
export type { EntityWatchEvent, RootCoreCollection, ContextualCoreCollection, CoreCollection, } from './hooks/useUseCase/types';
|
|
5
4
|
export type { UseCaseHookOptions } from './hooks/useUseCase/types';
|
|
6
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,6 +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["StatelessEnabled"] = 72] = "StatelessEnabled";
|
|
22
20
|
})(UseCaseStatuses || (exports.UseCaseStatuses = UseCaseStatuses = {}));
|
|
@@ -12,15 +12,11 @@ var _useConstant = require("../useConstant");
|
|
|
12
12
|
var useArgumentTypes = exports.useArgumentTypes = function useArgumentTypes(args) {
|
|
13
13
|
return (0, _useConstant.useConstant)(function () {
|
|
14
14
|
var types = _UseCaseArgumentTypes.UseCaseArgumentTypes.None;
|
|
15
|
-
var _args = (0, _slicedToArray2["default"])(args,
|
|
16
|
-
arg2 = _args[1]
|
|
17
|
-
arg3 = _args[2];
|
|
15
|
+
var _args = (0, _slicedToArray2["default"])(args, 2),
|
|
16
|
+
arg2 = _args[1];
|
|
18
17
|
var type2 = (0, _typeof2["default"])(arg2);
|
|
19
18
|
if (type2 === 'function') {
|
|
20
19
|
types |= _UseCaseArgumentTypes.UseCaseArgumentTypes.Entity;
|
|
21
|
-
if (typeof arg3 === 'number') {
|
|
22
|
-
types |= _UseCaseArgumentTypes.UseCaseArgumentTypes.Mode;
|
|
23
|
-
}
|
|
24
20
|
}
|
|
25
21
|
return types;
|
|
26
22
|
});
|