@mic-rexjs/usecases-react 1.3.35 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/index.min.js +1 -1
  2. package/es/components/UpdateFragment/index.d.ts +2 -0
  3. package/es/components/UpdateFragment/index.js +8 -0
  4. package/es/components/UpdateFragment/types.d.ts +3 -0
  5. package/es/components/UseCaseFragment/index.d.ts +1 -1
  6. package/es/components/UseCaseFragment/types.d.ts +2 -2
  7. package/es/configs/defaultUseCaseContext/index.d.ts +3 -1
  8. package/es/configs/defaultUseCaseContext/index.js +1 -1
  9. package/es/configs/defaultUseCaseContext/types.d.ts +11 -0
  10. package/es/configs/defaultUseCaseContext/types.js +1 -0
  11. package/es/configs/usecaseContextMap/index.d.ts +1 -3
  12. package/es/configs/usecaseContextMap/types.d.ts +4 -17
  13. package/es/hooks/useCompareDeps/index.d.ts +1 -0
  14. package/es/hooks/useCompareDeps/index.js +24 -0
  15. package/es/hooks/useConstant/index.d.ts +2 -0
  16. package/es/hooks/useConstant/index.js +5 -0
  17. package/es/hooks/useConstant/types.d.ts +3 -0
  18. package/es/hooks/useConstant/types.js +1 -0
  19. package/es/hooks/useConstantFn/index.d.ts +1 -0
  20. package/es/hooks/useConstantFn/index.js +7 -0
  21. package/es/hooks/useOptionsRefCollection/index.d.ts +3 -0
  22. package/es/hooks/useOptionsRefCollection/index.js +22 -0
  23. package/es/hooks/useOptionsRefCollection/types.d.ts +2 -0
  24. package/es/hooks/useOptionsRefCollection/types.js +1 -0
  25. package/es/hooks/useProvider/index.d.ts +7 -0
  26. package/es/hooks/useProvider/index.js +17 -0
  27. package/es/hooks/useProvider/types.d.ts +3 -0
  28. package/es/hooks/useProvider/types.js +1 -0
  29. package/es/hooks/useScope/index.d.ts +2 -0
  30. package/es/hooks/useScope/index.js +3 -0
  31. package/es/hooks/useScope/types.d.ts +3 -0
  32. package/es/hooks/useScope/types.js +1 -0
  33. package/es/hooks/useUseCase/index.js +68 -89
  34. package/es/hooks/useUseCase/index.test.js +166 -136
  35. package/es/hooks/useUseCase/types.d.ts +9 -7
  36. package/es/hooks/useUseCaseContext/index.d.ts +3 -0
  37. package/es/hooks/useUseCaseContext/index.js +17 -0
  38. package/es/index.d.ts +3 -2
  39. package/es/methods/getRootEntity/index.d.ts +2 -0
  40. package/es/methods/getRootEntity/index.js +9 -0
  41. package/es/methods/initEntityReducers/index.d.ts +5 -0
  42. package/es/methods/initEntityReducers/index.js +13 -0
  43. package/es/methods/initEntityReducers/types.d.ts +3 -0
  44. package/es/methods/initEntityReducers/types.js +1 -0
  45. package/es/methods/removeItem/index.d.ts +1 -0
  46. package/es/methods/removeItem/index.js +7 -0
  47. package/es/methods/triggerCallbacks/index.d.ts +3 -0
  48. package/es/methods/triggerCallbacks/index.js +14 -0
  49. package/es/{hooks/useUseCase/methods → methods}/triggerWatchers/index.d.ts +1 -1
  50. package/lib/components/UpdateFragment/index.js +16 -0
  51. package/lib/configs/defaultUseCaseContext/index.js +1 -1
  52. package/lib/configs/defaultUseCaseContext/types.js +5 -0
  53. package/lib/hooks/useCompareDeps/index.js +31 -0
  54. package/lib/hooks/useConstant/index.js +16 -0
  55. package/lib/hooks/useConstant/types.js +5 -0
  56. package/lib/hooks/useConstantFn/index.js +18 -0
  57. package/lib/hooks/useOptionsRefCollection/index.js +29 -0
  58. package/lib/hooks/useOptionsRefCollection/types.js +5 -0
  59. package/lib/hooks/useProvider/index.js +30 -0
  60. package/lib/hooks/useProvider/types.js +5 -0
  61. package/lib/hooks/useScope/index.js +10 -0
  62. package/lib/hooks/useScope/types.js +5 -0
  63. package/lib/hooks/useUseCase/index.js +73 -115
  64. package/lib/hooks/useUseCase/index.test.js +226 -177
  65. package/lib/hooks/useUseCaseContext/index.js +24 -0
  66. package/lib/methods/getRootEntity/index.js +16 -0
  67. package/lib/methods/initEntityReducers/index.js +29 -0
  68. package/lib/methods/initEntityReducers/types.js +5 -0
  69. package/lib/methods/removeItem/index.js +14 -0
  70. package/lib/methods/triggerCallbacks/index.js +22 -0
  71. package/package.json +2 -2
  72. package/es/core/usecases/optionsGetterCellectionUseCase/index.d.ts +0 -2
  73. package/es/core/usecases/optionsGetterCellectionUseCase/index.js +0 -13
  74. package/es/core/usecases/optionsGetterCellectionUseCase/types.d.ts +0 -8
  75. package/es/hooks/useOptionsTransfer/index.d.ts +0 -3
  76. package/es/hooks/useOptionsTransfer/index.js +0 -15
  77. package/es/hooks/useUseCase/methods/triggerCallbacks/index.d.ts +0 -3
  78. package/es/hooks/useUseCase/methods/triggerCallbacks/index.js +0 -11
  79. package/lib/core/usecases/optionsGetterCellectionUseCase/index.js +0 -23
  80. package/lib/hooks/useOptionsTransfer/index.js +0 -23
  81. package/lib/hooks/useUseCase/methods/triggerCallbacks/index.js +0 -32
  82. /package/es/{core/usecases/optionsGetterCellectionUseCase → components/UpdateFragment}/types.js +0 -0
  83. /package/es/{hooks/useUseCase/methods → methods}/triggerWatchers/index.js +0 -0
  84. /package/lib/{core/usecases/optionsGetterCellectionUseCase → components/UpdateFragment}/types.js +0 -0
  85. /package/lib/{hooks/useUseCase/methods → methods}/triggerWatchers/index.js +0 -0
package/dist/index.min.js CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! For license information please see index.min.js.LICENSE.txt */
2
- !function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("react"),require("ahooks"),require("@mic-rexjs/usecases"));else if("function"==typeof define&&define.amd)define(["react","ahooks","@mic-rexjs/usecases"],r);else{var t="object"==typeof exports?r(require("react"),require("ahooks"),require("@mic-rexjs/usecases")):r(e.react,e.ahooks,e["@mic-rexjs/usecases"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,((e,r,t)=>(()=>{"use strict";var n={251:(e,r,t)=>{var n=t(156),o=Symbol.for("react.element"),u=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),i=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};r.jsx=function(e,r,t){var n,c={},f=null,l=null;for(n in void 0!==t&&(f=""+t),void 0!==r.key&&(f=""+r.key),void 0!==r.ref&&(l=r.ref),r)u.call(r,n)&&!a.hasOwnProperty(n)&&(c[n]=r[n]);if(e&&e.defaultProps)for(n in r=e.defaultProps)void 0===c[n]&&(c[n]=r[n]);return{$$typeof:o,type:e,key:f,ref:l,props:c,_owner:i.current}}},893:(e,r,t)=>{e.exports=t(251)},112:e=>{e.exports=t},749:e=>{e.exports=r},156:r=>{r.exports=e}},o={};function u(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return n[e](t,t.exports,u),t.exports}u.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return u.d(r,{a:r}),r},u.d=(e,r)=>{for(var t in r)u.o(r,t)&&!u.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},u.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),u.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{u.r(i),u.d(i,{UseCaseFragment:()=>g,useUseCase:()=>O});var e=u(893),r=u(156),t=u.n(r);function n(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}function o(e,r){if(e){if("string"==typeof e)return n(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(e,r):void 0}}function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function c(e,r,t){return(r=function(e){var r=function(e,r){if("object"!==a(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==a(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===a(r)?r:String(r)}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function f(e,r){return function(e){if(Array.isArray(e))return e}(e)||function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,o,u,i,a=[],c=!0,f=!1;try{if(u=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;c=!1}else for(;!(c=(n=u.call(t)).done)&&(a.push(n.value),a.length!==r);c=!0);}catch(e){f=!0,o=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(f)throw o}}return a}}(e,r)||o(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var l=u(749),s=(0,r.createContext)(null),y=new Map,p=function(e,r,t){for(var n=0,o=Object.entries(e);n<o.length;n++){var u=f(o[n],2),i=u[0],a=u[1];(null==r?void 0:r[i])!==(null==t?void 0:t[i])&&a(r,t)}};function b(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}var v=u(112),m=["stateless","watch","onChange","options"];function d(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function h(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?d(Object(t),!0).forEach((function(r){c(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):d(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var O=function(e,u,i,a){var c,d=f((0,r.useState)("function"==typeof u),1)[0],O=f((0,r.useState)(d?e:null),2),g=O[0],j=O[1],S=(d?i:u)||{},w=S.stateless,x=(S.watch,S.onChange,S.options),P=function(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},u=Object.keys(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}(S,m),_=(0,r.useRef)([]),C=(d?a:i)||[],A=f((0,r.useState)((function(){return d?u:e})),1)[0],E=f((0,r.useState)((function(){var e=y,t=A;if(e.has(t))return e.get(t);if(!d)return s;var n=(0,r.createContext)(null);return e.set(t,n),n})),1)[0],M=f((0,r.useContext)(E)||[],3),I=M[0],k=M[1],T=M[2],R=(0,r.useMemo)((function(){return d?w?"function"!=typeof e?e:e():g:I}),[d,I,w,g,e]),U=(0,l.useMemoizedFn)((function(){var e=h(h({},P),x);return d?(0,(0,v.entityReducerUseCase)().createEntityReducers)(R,A,h(h({},e),{},{onChange:function(e,r){d&&!w&&j(e),function(e,r,t){var n,o=function(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return b(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?b(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u,i=!0,a=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){a=!0,u=e},f:function(){try{i||null==t.return||t.return()}finally{if(a)throw u}}}}(e);try{for(o.s();!(n=o.n()).done;){var u=(0,n.value)(),i=u.onChange,a=u.watch;null==i||i(r,t),a&&p(a,r,t)}}catch(e){o.e(e)}finally{o.f()}}(_.current,e,r)},onGenerate:function(e,r){return r}})):k||A(e)})),q=r.useMemo.call(null,U,[R,U].concat(function(e){if(Array.isArray(e))return n(e)}(c=C)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||o(c)||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.")}())),D=(0,r.useMemo)((function(){return!d&&T?T:(e=_.current,{addOptionsGetter:function(r){e.unshift(r)},removeOptionsGetter:function(r){var t=e.indexOf(r);-1!==t&&e.splice(t,1)}});var e}),[d,T]),F=(0,r.useMemo)((function(){return[R,q,D]}),[R,q,D]),G=(0,l.useLatest)(F),L=f((0,r.useState)((function(){return function(e){var r=e.children,n=E.Provider;return t().createElement(n,{value:G.current},r)}})),1)[0],$=(0,r.useMemo)((function(){return d?[R,q,L]:[R,q]}),[R,q,d,L]),N=(0,r.useMemo)((function(){return E===s?q:$}),[E,q,$]);return function(e,r){var t=r.addOptionsGetter,n=r.removeOptionsGetter,o=(0,l.usePrevious)(n),u=(0,l.useMemoizedFn)((function(){return e}));(0,l.useCreation)((function(){null==o||o(u),t(u)}),[t,o,u]),(0,l.useUnmount)((function(){n(u)}))}(S,D),N},g=function(t){var n=t.usecase,o=t.watch,u=t.onChange;return O(n,{watch:o,onChange:u}),(0,e.jsx)(r.Fragment,{})}})(),i})()));
2
+ !function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("react"),require("ahooks"),require("@mic-rexjs/usecases"));else if("function"==typeof define&&define.amd)define(["react","ahooks","@mic-rexjs/usecases"],r);else{var t="object"==typeof exports?r(require("react"),require("ahooks"),require("@mic-rexjs/usecases")):r(e.react,e.ahooks,e["@mic-rexjs/usecases"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,((e,r,t)=>(()=>{"use strict";var n={251:(e,r,t)=>{var n=t(156),o=Symbol.for("react.element"),u=(Symbol.for("react.fragment"),Object.prototype.hasOwnProperty),i=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};r.jsx=function(e,r,t){var n,c={},f=null,s=null;for(n in void 0!==t&&(f=""+t),void 0!==r.key&&(f=""+r.key),void 0!==r.ref&&(s=r.ref),r)u.call(r,n)&&!a.hasOwnProperty(n)&&(c[n]=r[n]);if(e&&e.defaultProps)for(n in r=e.defaultProps)void 0===c[n]&&(c[n]=r[n]);return{$$typeof:o,type:e,key:f,ref:s,props:c,_owner:i.current}}},893:(e,r,t)=>{e.exports=t(251)},112:e=>{e.exports=t},749:e=>{e.exports=r},156:r=>{r.exports=e}},o={};function u(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return n[e](t,t.exports,u),t.exports}u.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return u.d(r,{a:r}),r},u.d=(e,r)=>{for(var t in r)u.o(r,t)&&!u.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},u.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),u.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{u.r(i),u.d(i,{UseCaseFragment:()=>g,useUseCase:()=>h});var e=u(893),r=u(156),t=u.n(r);function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function o(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=new Array(r);t<r;t++)n[t]=e[t];return n}function a(e,r){return function(e){if(Array.isArray(e))return e}(e)||function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,o,u,i,a=[],c=!0,f=!1;try{if(u=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;c=!1}else for(;!(c=(n=u.call(t)).done)&&(a.push(n.value),a.length!==r);c=!0);}catch(e){f=!0,o=e}finally{try{if(!c&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(f)throw o}}return a}}(e,r)||function(e,r){if(e){if("string"==typeof e)return o(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?o(e,r):void 0}}(e,r)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var c=u(749),f=function(e){return a((0,r.useState)(e),1)[0]};function s(e,r,t){return(r=function(e){var r=function(e,r){if("object"!==n(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,"string");if("object"!==n(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===n(r)?r:String(r)}(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}var l=u(112),p=["stateless","watch","onChange","options"];function y(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function v(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?y(Object(t),!0).forEach((function(r){s(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):y(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}var b=function(e,r){var t=e.indexOf(r);-1!==t&&e.splice(t,1)},d=function(e,r,t){for(var n=0,o=Object.entries(e);n<o.length;n++){var u=a(o[n],2),i=u[0],c=u[1];(null==r?void 0:r[i])!==(null==t?void 0:t[i])&&c(r,t)}},m=new Map,O=(0,r.createContext)({}),h=function(e,o,u,i){var s,y,h,g,j,S,w,x,C=f("function"==typeof o),P=(C?u:o)||{},_=P.stateless,E=a((0,r.useState)(C&&!_?e:null),2),R=E[0],k=E[1],A=(y=(C?i:u)||[],h=(0,r.useRef)(0),g=(0,r.useRef)([]),j=g.current,S=j.length,w=y.length,x=function(){if(w!==S)return!0;for(var e=0;e<w;e++)if(y[e]!==j[e])return!0;return!1}(),g.current=y,h.current+=x?1:0,h.current),I=(s=C?o:e,a((0,r.useState)((function(){return s})),1)[0]),M=I,T=function(e,t){return f((function(){var n=m;if(n.has(e))return n.get(e);if(t)return t;var o=(0,r.createContext)({});return n.set(e,o),o}))}(M,C?null:O),U=(0,r.useContext)(T),q=U.entity,D=U.reducers,F=U.optionsRefCollection,L="object"===n(F),N=C||L,$=function(e,r,t){var n=(0,c.useLatest)(t),o=(0,c.useCreation)((function(){return e?[]:r}),[r,e]),u=(0,c.usePrevious)(o);return(0,c.useCreation)((function(){u&&b(u,n),o.push(n)}),[n,o,u]),(0,c.useUnmount)((function(){b(o,n)})),o}(C||!L,F||null,P),z=(0,c.useCreation)((function(){return C?function(e,r,t){return t?"function"==typeof r?r():r:e}(R,e,_):q}),[C,q,_,R,e]),B=(0,c.useMemoizedFn)((function(e,r){_||k(e),function(e,r,t){for(var n=e.length;n>0;n--){var o=e[n-1].current;if(o){var u=o.onChange,i=o.watch;i&&d(i,r,t),null==u||u(r,t)}}}($,e,r)})),G=(0,c.useMemoizedFn)((function(){var e={},r={};return C?r=function(e,r,t,n){var o=(0,l.entityReducerUseCase)().createEntityReducers,u=(t.stateless,t.watch,t.onChange,t.options);return o(e,r,v(v(v({},function(e,r){if(null==e)return{};var t,n,o=function(e,r){if(null==e)return{};var t,n,o={},u=Object.keys(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||(o[t]=e[t]);return o}(e,r);if(Object.getOwnPropertySymbols){var u=Object.getOwnPropertySymbols(e);for(n=0;n<u.length;n++)t=u[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}(t,p)),u),{},{onChange:n,onGenerate:function(e,r){return r}}))}(z,M,P,B):D?r=D:e=I(P),[e,r]})),W=C?z:D,Y=a((0,c.useCreation)((function(){return G()}),[G,A,W]),2),H=Y[0],J=Y[1],K=function(e,r,n,o){var u=(0,c.useCreation)((function(){return{entity:r,reducers:n,optionsRefCollection:o}}),[r,n,o]),i=(0,c.useLatest)(u);return f((function(){return function(r){var n=r.children,o=e.Provider;return t().createElement(o,{value:i.current},n)}}))}(T,z,J,$),Q=(0,c.useCreation)((function(){return[z,J,C?K:null]}),[C,z,J,K]);return(0,c.useCreation)((function(){return N?Q:H}),[N,H,Q])},g=function(t){var n=t.usecase,o=t.watch,u=t.onChange;return h(n,{watch:o,onChange:u}),(0,e.jsx)(r.Fragment,{})}})(),i})()));
@@ -0,0 +1,2 @@
1
+ import { UpdateFragmentProps } from './types';
2
+ export declare const UpdateFragment: ({ onUpdate }: UpdateFragmentProps) => React.ReactElement;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Fragment, useEffect } from 'react';
3
+ export const UpdateFragment = ({ onUpdate }) => {
4
+ useEffect(() => {
5
+ onUpdate?.();
6
+ });
7
+ return _jsx(Fragment, {});
8
+ };
@@ -0,0 +1,3 @@
1
+ export interface UpdateFragmentProps {
2
+ onUpdate?(): void;
3
+ }
@@ -1,3 +1,3 @@
1
1
  import { UseCaseFragmentProps } from './types';
2
2
  import { EntityReducers } from '@mic-rexjs/usecases';
3
- export declare const UseCaseFragment: <T, TReducers extends EntityReducers<T>>({ usecase, watch, onChange, }: UseCaseFragmentProps<T, TReducers>) => React.ReactElement;
3
+ export declare const UseCaseFragment: <T, TEntityReducers extends EntityReducers<T>>({ usecase, watch, onChange, }: UseCaseFragmentProps<T, TEntityReducers>) => React.ReactElement;
@@ -1,7 +1,7 @@
1
1
  import { EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
2
2
  import { EntityWatchMap } from '../../hooks/useUseCase/types';
3
- export interface UseCaseFragmentProps<T, TReducers extends EntityReducers<T>> {
4
- usecase: EntityUseCase<T, TReducers & EntityReducers<T>>;
3
+ export interface UseCaseFragmentProps<T, TEntityReducers extends EntityReducers<T>> {
4
+ usecase: EntityUseCase<T, TEntityReducers & EntityReducers<T>>;
5
5
  watch?: EntityWatchMap<T>;
6
6
  onChange?(prevEntity: T, nextEntity: T): void;
7
7
  }
@@ -1,2 +1,4 @@
1
1
  /// <reference types="react" />
2
- export declare const defaultUseCaseContext: import("react").Context<null>;
2
+ import { EntityReducers } from '@mic-rexjs/usecases';
3
+ import { UseCaseContextValue } from './types';
4
+ export declare const defaultUseCaseContext: import("react").Context<UseCaseContextValue<unknown, EntityReducers<unknown>, object>>;
@@ -1,2 +1,2 @@
1
1
  import { createContext } from 'react';
2
- export const defaultUseCaseContext = createContext(null);
2
+ export const defaultUseCaseContext = createContext({});
@@ -0,0 +1,11 @@
1
+ import { OptionsRefCollection } from '../../hooks/useOptionsRefCollection/types';
2
+ import { AsyncEntityGenerator, EntityGenerator, EntityReducer, EntityReducers } from '@mic-rexjs/usecases';
3
+ export type ContextualEntityReducer<T, TReducer extends EntityReducer<T>> = TReducer extends (entity: T, ...args: infer TArgs) => infer TReturn ? (...args: TArgs) => TReturn extends AsyncEntityGenerator<T, infer TResult> ? Promise<TResult> : TReturn extends EntityGenerator<T, infer TResult> ? TResult : TReturn : never;
4
+ export type ContextualEntityReducers<T, TEntityReducers extends EntityReducers<T>> = {
5
+ [K in keyof TEntityReducers]: ContextualEntityReducer<T, TEntityReducers[K]>;
6
+ };
7
+ export interface UseCaseContextValue<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object> {
8
+ entity?: T;
9
+ reducers?: ContextualEntityReducers<T, TEntityReducers>;
10
+ optionsRefCollection?: OptionsRefCollection<TUseCaseOptions>;
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1 @@
1
- import { EntityReducers } from '@mic-rexjs/usecases';
2
- import { UseCaseContextMap } from './types';
3
- export declare const usecaseContextMap: UseCaseContextMap<unknown, EntityReducers<unknown>>;
1
+ export declare const usecaseContextMap: Map<any, any>;
@@ -1,20 +1,7 @@
1
1
  /// <reference types="react" />
2
- import { OptionsGetterCollectionReducers } from '../../core/usecases/optionsGetterCellectionUseCase/types';
3
- import { AsyncEntityGenerator, EntityGenerator, EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
4
- export type ContextualEntityReducer<T> = T extends (entity: infer TEntity, ...args: infer TArgs) => infer TReturn ? (...args: TArgs) => TReturn extends AsyncEntityGenerator<TEntity, infer TResult> ? Promise<TResult> : TReturn extends EntityGenerator<TEntity, infer TResult> ? TResult : TReturn : never;
5
- export type ContextualEntityReducers<T> = {
6
- [K in keyof T]: ContextualEntityReducer<T[K]>;
7
- };
8
- export type UseCaseContext<T, TReducers> = [entity: T, reducers: ContextualEntityReducers<TReducers>];
9
- export type UseCaseContextWithCollectionReducers<T, TReducers, TOptions> = [
10
- ...context: UseCaseContext<T, TReducers>,
11
- collectionReducers: OptionsGetterCollectionReducers<TOptions>
12
- ];
13
- export interface UseCaseProvider extends React.FC<React.PropsWithChildren> {
2
+ import { EntityReducers, EntityUseCase } from '@mic-rexjs/usecases';
3
+ import { UseCaseContextValue } from '../defaultUseCaseContext/types';
4
+ export interface UseCaseMappingContext<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object> extends React.Context<UseCaseContextValue<T, TEntityReducers, TUseCaseOptions>> {
14
5
  }
15
- export type UseCaseContextWithProvider<T, TReducers> = [
16
- ...args: UseCaseContext<T, TReducers>,
17
- Provider: UseCaseProvider
18
- ];
19
- export interface UseCaseContextMap<T, TReducers extends EntityReducers<T>, TOptions = object> extends Map<EntityUseCase<T, TReducers>, React.Context<UseCaseContextWithCollectionReducers<T, TReducers, TOptions> | null>> {
6
+ export interface UseCaseContextMap<T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object = object> extends Map<EntityUseCase<T, TEntityReducers, TUseCaseOptions>, UseCaseMappingContext<T, TEntityReducers, TUseCaseOptions>> {
20
7
  }
@@ -0,0 +1 @@
1
+ export declare const useCompareDeps: <T>(deps: T[]) => React.Key;
@@ -0,0 +1,24 @@
1
+ import { useRef } from 'react';
2
+ import { useScope } from '../useScope';
3
+ export const useCompareDeps = (deps) => {
4
+ const updateTimesRef = useRef(0);
5
+ const prevDepsRef = useRef([]);
6
+ const { current: prevDeps } = prevDepsRef;
7
+ const { length: prevLength } = prevDeps;
8
+ const { length } = deps;
9
+ const updated = useScope(() => {
10
+ if (length !== prevLength) {
11
+ return true;
12
+ }
13
+ for (let i = 0; i < length; i++) {
14
+ if (deps[i] === prevDeps[i]) {
15
+ continue;
16
+ }
17
+ return true;
18
+ }
19
+ return false;
20
+ });
21
+ prevDepsRef.current = deps;
22
+ updateTimesRef.current += updated ? 1 : 0;
23
+ return updateTimesRef.current;
24
+ };
@@ -0,0 +1,2 @@
1
+ import { ConstantInitializer } from './types';
2
+ export declare const useConstant: <T>(initialValue: T | ConstantInitializer<T>) => T;
@@ -0,0 +1,5 @@
1
+ import { useState } from 'react';
2
+ export const useConstant = (initialValue) => {
3
+ const [value] = useState(initialValue);
4
+ return value;
5
+ };
@@ -0,0 +1,3 @@
1
+ export interface ConstantInitializer<T> {
2
+ (): T;
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const useConstantFn: <T>(initialValue: T) => T;
@@ -0,0 +1,7 @@
1
+ import { useState } from 'react';
2
+ export const useConstantFn = (initialValue) => {
3
+ const [value] = useState(() => {
4
+ return initialValue;
5
+ });
6
+ return value;
7
+ };
@@ -0,0 +1,3 @@
1
+ import { UseCaseHookOptions } from '../useUseCase/types';
2
+ import { OptionsRefCollection } from './types';
3
+ export declare const useOptionsRefCollection: <T, TUseCaseOptions extends object, TOptions extends UseCaseHookOptions<T, TUseCaseOptions> = UseCaseHookOptions<T, TUseCaseOptions>>(isRoot: boolean, contextOptionsRefCollection: OptionsRefCollection<TOptions> | null, options: TOptions) => OptionsRefCollection<TOptions>;
@@ -0,0 +1,22 @@
1
+ import { useCreation, useLatest, usePrevious, useUnmount } from 'ahooks';
2
+ import { removeItem } from '../../methods/removeItem';
3
+ export const useOptionsRefCollection = (isRoot, contextOptionsRefCollection, options) => {
4
+ const optionsRef = useLatest(options);
5
+ const optionsRefCollection = useCreation(() => {
6
+ if (isRoot) {
7
+ return [];
8
+ }
9
+ return contextOptionsRefCollection;
10
+ }, [contextOptionsRefCollection, isRoot]);
11
+ const prevOptionsRefCollection = usePrevious(optionsRefCollection);
12
+ useCreation(() => {
13
+ if (prevOptionsRefCollection) {
14
+ removeItem(prevOptionsRefCollection, optionsRef);
15
+ }
16
+ optionsRefCollection.push(optionsRef);
17
+ }, [optionsRef, optionsRefCollection, prevOptionsRefCollection]);
18
+ useUnmount(() => {
19
+ removeItem(optionsRefCollection, optionsRef);
20
+ });
21
+ return optionsRefCollection;
22
+ };
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export type OptionsRefCollection<T> = React.MutableRefObject<T>[];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { UseCaseMappingContext } from '../../configs/usecaseContextMap/types';
2
+ import { EntityReducers } from '@mic-rexjs/usecases';
3
+ import { UseCaseHookOptions } from '../useUseCase/types';
4
+ import { ContextualEntityReducers } from '../../configs/defaultUseCaseContext/types';
5
+ import { UseCaseProvider } from './types';
6
+ import { OptionsRefCollection } from '../useOptionsRefCollection/types';
7
+ export declare const useProvider: <T, TEntityReducers extends EntityReducers<T>, TUseCaseOptions extends object>(context: UseCaseMappingContext<T, TEntityReducers, TUseCaseOptions>, entity: T, reducers: ContextualEntityReducers<T, TEntityReducers>, optionsRefCollection: OptionsRefCollection<UseCaseHookOptions<T, TUseCaseOptions>>) => UseCaseProvider;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { useConstant } from '../useConstant';
3
+ import { useCreation, useLatest } from 'ahooks';
4
+ export const useProvider = (context, entity, reducers, optionsRefCollection) => {
5
+ const contextValue = useCreation(() => {
6
+ return { entity, reducers, optionsRefCollection };
7
+ }, [entity, reducers, optionsRefCollection]);
8
+ const contextValueRef = useLatest(contextValue);
9
+ return useConstant(() => {
10
+ return ({ children }) => {
11
+ const { Provider: ContextProvider } = context;
12
+ return React.createElement(ContextProvider, {
13
+ value: contextValueRef.current,
14
+ }, children);
15
+ };
16
+ });
17
+ };
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ export interface UseCaseProvider extends React.FC<React.PropsWithChildren> {
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { Scope } from './types';
2
+ export declare const useScope: <T>(scope: Scope<T>) => T;
@@ -0,0 +1,3 @@
1
+ export const useScope = (scope) => {
2
+ return scope();
3
+ };
@@ -0,0 +1,3 @@
1
+ export interface Scope<T> {
2
+ (): T;
3
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,99 +1,78 @@
1
- import { useLatest, useMemoizedFn } from 'ahooks';
2
- import React, { createContext, useContext, useMemo, useRef, useState } from 'react';
1
+ import { useCreation, useMemoizedFn } from 'ahooks';
2
+ import { useContext, useState } from 'react';
3
+ import { useConstant } from '../useConstant';
4
+ import { useConstantFn } from '../useConstantFn';
5
+ import { useProvider } from '../useProvider';
6
+ import { useCompareDeps } from '../useCompareDeps';
7
+ import { initEntityReducers } from '../../methods/initEntityReducers';
8
+ import { useOptionsRefCollection } from '../useOptionsRefCollection';
9
+ import { triggerCallbacks } from '../../methods/triggerCallbacks';
10
+ import { getRootEntity } from '../../methods/getRootEntity';
11
+ import { useUseCaseContext } from '../useUseCaseContext';
3
12
  import { defaultUseCaseContext } from '../../configs/defaultUseCaseContext';
4
- import { usecaseContextMap } from '../../configs/usecaseContextMap';
5
- import { optionsGetterCollectionUseCase } from '../../core/usecases/optionsGetterCellectionUseCase';
6
- import { triggerCallbacks } from './methods/triggerCallbacks';
7
- import { useOptionsTransfer } from '../useOptionsTransfer';
8
- import { entityReducerUseCase } from '@mic-rexjs/usecases';
9
- export const useUseCase = ((arg1, arg2, arg3, arg4) => {
10
- const [hasDefaultEntity] = useState(typeof arg2 === 'function');
11
- const [entityState, setEntityState] = useState(hasDefaultEntity ? arg1 : null);
12
- const options = (hasDefaultEntity ? arg3 : arg2) || {};
13
- const { stateless, watch, onChange, options: usecaseOptions, ...restUseCaseOptions } = options;
14
- const optionsGetterListRef = useRef([]);
15
- const deps = (hasDefaultEntity ? arg4 : arg3) || [];
16
- const [usecase] = useState(() => {
17
- return hasDefaultEntity
18
- ? arg2
19
- : arg1;
20
- });
21
- const [context] = useState(() => {
22
- const map = usecaseContextMap;
23
- const entityUseCase = usecase;
24
- if (map.has(entityUseCase)) {
25
- return map.get(entityUseCase);
26
- }
27
- if (!hasDefaultEntity) {
28
- return defaultUseCaseContext;
29
- }
30
- const ctx = createContext(null);
31
- map.set(entityUseCase, ctx);
32
- return ctx;
33
- });
34
- const [contextEntity, contextEntityReducers, contextCollectionReducers] = useContext(context) || [];
35
- const entity = useMemo(() => {
36
- if (!hasDefaultEntity) {
13
+ export const useUseCase = (arg1, arg2, arg3, arg4) => {
14
+ const hasInitialEntity = useConstant(typeof arg2 === 'function');
15
+ const options = ((hasInitialEntity ? arg3 : arg2) || {});
16
+ const { stateless } = options;
17
+ const [entityState, setEntityState] = useState(hasInitialEntity && !stateless ? arg1 : null);
18
+ const deps = ((hasInitialEntity ? arg4 : arg3) || []);
19
+ const depsKey = useCompareDeps(deps);
20
+ const usecase = useConstantFn(hasInitialEntity
21
+ ? arg2
22
+ : arg1);
23
+ const entityUseCase = usecase;
24
+ const defaultContext = defaultUseCaseContext;
25
+ const context = useUseCaseContext(entityUseCase, hasInitialEntity ? null : defaultContext);
26
+ const { entity: contextEntity, reducers: contextEntityReducers, optionsRefCollection: contextOptionsRefCollection, } = useContext(context);
27
+ // 只有 `contextOptionsRefCollection` 是可控的,是当前 `hook` 生成的,所以用其来判断最保险
28
+ const hasContextOptionsRefCollection = typeof contextOptionsRefCollection === 'object';
29
+ // 是否需要初始化根 `redurcers`
30
+ const isRoot = hasInitialEntity || !hasContextOptionsRefCollection;
31
+ // 是否为上下文模式
32
+ const isContextMode = hasInitialEntity || hasContextOptionsRefCollection;
33
+ // 获取 `optionsRefCollection`
34
+ const optionsRefCollection = useOptionsRefCollection(isRoot, contextOptionsRefCollection || null, options);
35
+ const entity = useCreation(() => {
36
+ if (!hasInitialEntity) {
37
37
  return contextEntity;
38
38
  }
39
+ return getRootEntity(entityState, arg1, stateless);
40
+ }, [hasInitialEntity, contextEntity, stateless, entityState, arg1]);
41
+ const onEntityChange = useMemoizedFn((newEntity, prevEntity) => {
39
42
  if (!stateless) {
40
- return entityState;
43
+ setEntityState(newEntity);
41
44
  }
42
- if (typeof arg1 !== 'function') {
43
- return arg1;
45
+ triggerCallbacks(optionsRefCollection, newEntity, prevEntity);
46
+ });
47
+ const createReducers = useMemoizedFn(() => {
48
+ let reducers = {};
49
+ let entityReducers = {};
50
+ if (hasInitialEntity) {
51
+ const initOptions = options;
52
+ entityReducers = initEntityReducers(entity, entityUseCase, initOptions, onEntityChange);
44
53
  }
45
- return arg1();
46
- }, [hasDefaultEntity, contextEntity, stateless, entityState, arg1]);
47
- const initReducers = useMemoizedFn(() => {
48
- const mergedOptions = { ...restUseCaseOptions, ...usecaseOptions };
49
- if (!hasDefaultEntity) {
50
- return contextEntityReducers || usecase(mergedOptions);
54
+ else if (contextEntityReducers) {
55
+ entityReducers = contextEntityReducers;
51
56
  }
52
- const { createEntityReducers } = entityReducerUseCase();
53
- return createEntityReducers(entity, usecase, {
54
- ...mergedOptions,
55
- onChange(newEntity, prevEntity) {
56
- if (hasDefaultEntity && !stateless) {
57
- setEntityState(newEntity);
58
- }
59
- triggerCallbacks(optionsGetterListRef.current, newEntity, prevEntity);
60
- },
61
- onGenerate(newEntity, result) {
62
- return result;
63
- },
64
- });
65
- });
66
- const reducers = useMemo.call(null, initReducers, [entity, initReducers, ...deps]);
67
- const collectionReducers = useMemo(() => {
68
- if (!hasDefaultEntity && contextCollectionReducers) {
69
- return contextCollectionReducers;
57
+ else {
58
+ reducers = usecase(options);
70
59
  }
71
- return optionsGetterCollectionUseCase(optionsGetterListRef.current);
72
- }, [hasDefaultEntity, contextCollectionReducers]);
73
- const contextValueWithCollectionReducers = useMemo(() => {
74
- return [entity, reducers, collectionReducers];
75
- }, [entity, reducers, collectionReducers]);
76
- const contextValueWithCollectionReducersRef = useLatest(contextValueWithCollectionReducers);
77
- const [Provider] = useState(() => {
78
- return ({ children }) => {
79
- const { Provider: ContextProvider } = context;
80
- return React.createElement(ContextProvider, {
81
- value: contextValueWithCollectionReducersRef.current,
82
- }, children);
83
- };
60
+ return [reducers, entityReducers];
84
61
  });
85
- const contextValue = useMemo(() => {
86
- if (hasDefaultEntity) {
87
- return [entity, reducers, Provider];
88
- }
89
- return [entity, reducers];
90
- }, [entity, reducers, hasDefaultEntity, Provider]);
91
- const result = useMemo(() => {
92
- if (context === defaultUseCaseContext) {
93
- return reducers;
62
+ const createReducersDep = hasInitialEntity ? entity : contextEntityReducers;
63
+ const [reducers, entityReducers] = useCreation(() => {
64
+ void depsKey;
65
+ void createReducersDep;
66
+ return createReducers();
67
+ }, [createReducers, depsKey, createReducersDep]);
68
+ const Provider = useProvider(context, entity, entityReducers, optionsRefCollection);
69
+ const coreCollection = useCreation(() => {
70
+ return [entity, entityReducers, hasInitialEntity ? Provider : null];
71
+ }, [hasInitialEntity, entity, entityReducers, Provider]);
72
+ return useCreation(() => {
73
+ if (isContextMode) {
74
+ return coreCollection;
94
75
  }
95
- return contextValue;
96
- }, [context, reducers, contextValue]);
97
- void useOptionsTransfer(options, collectionReducers);
98
- return result;
99
- });
76
+ return reducers;
77
+ }, [isContextMode, reducers, coreCollection]);
78
+ };