mpstore-next
Version:
一个轻量级的状态管理库,类似于`pinia`、`vuex`,适用于微信小程序。
2 lines (1 loc) • 9.19 kB
JavaScript
;const e="$state",t="$getter";function n(e){const t=new Map,n=e=>{if("object"!=typeof e||null===e)return e;const r=t.get(e);if(r)return r;const o=Array.isArray(e)?[]:{};Object.setPrototypeOf(o,Object.getPrototypeOf(e)),t.set(e,o);for(const t in e)e.hasOwnProperty(t)&&(o[t]=n(e[t]));return o},r=n(e);return t.clear(),r}function r(e){return Object.getOwnPropertyNames(e).map(t=>{const n=Object.getOwnPropertyDescriptor(e,t);return n?"function"!=typeof n.get||n.set?"function"==typeof n.value?{key:t,type:"function"}:{key:t,type:"property"}:{key:t,type:"getter"}:{key:t,type:"unknown"}})}const o=(e,...t)=>(e?e+".":"")+t.join("."),s=(n,r,s,c)=>{const i={};for(const{key:u,type:a}of r)if(n.hasOwnProperty(u)){if(void 0===n[u])continue;if(c&&-1==c.indexOf(u))continue;if("property"===a){i[o(s,e,u)]=n[u]}else if("getter"===a){i[o(s,t,u)]=n[u]}}return i},c=(n,r,s,c)=>{const i={};for(const{key:u,type:l}of r)if(n.hasOwnProperty(u))if("property"===l){const t=o(s,e,u);if(c&&!a(c,t))continue;i[t]=null}else if("getter"===l){const e=o(s,t,u);if(c&&!a(c,e))continue;i[e]=null}return i};function i(e,t="",n){const r={},o=Object.keys(e);for(let s=0;s<o.length;s++){const c=o[s],i=t+"."+c;n&&!a(n,i)||(r[i]=e[c])}return r}function u(e,t){const n={},r=Object.keys(e);for(let o=0;o<r.length;o++){const s=r[o];t&&!a(t,s)||(n[s]=e[s])}return n}function a(e,t){return e.some(e=>t.startsWith(e))}function l(n,r){const o=[];return n.forEach(n=>{let s="";r&&""!=r&&(s=r+"."),o.push(s+t+"."+n),o.push(s+e+"."+n)}),o}const f=Symbol("toRaw");function p(e){if(null==e||"object"!=typeof e)return e;const t="object"==typeof(n=e)&&null!==n&&"function"==typeof n[f]?e[f]():e;var n;if(Array.isArray(t))return t.map(e=>p(e));const r={};for(const e of Reflect.ownKeys(t)){const n=t[e];r[e]=p(n)}return r}function y(e,t){let n=null;return function(...r){const o=this;n&&clearTimeout(n),n=setTimeout(()=>{e.apply(o,r)},t)}}function d(e,t){if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return!1;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!d(e[n],t[n]))return!1;return!0}if(Array.isArray(e)!==Array.isArray(t))return!1;const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(const r of n){if(!(r in t))return!1;if(!d(e[r],t[r]))return!1}return!0}const h=e=>{const t=(e=>{var t,n,r,o;const s=[];if(null===(t=e.stores)||void 0===t?void 0:t.config)e.stores.config.forEach(t=>{var n;t.store&&s.push({store:t.store,usePart:null===(n=e.stores)||void 0===n?void 0:n.usePart,useProp:t.useProp})});else{if(!(null===(n=e.stores)||void 0===n?void 0:n.store))return s;Array.isArray(e.stores.store)?e.stores.store.forEach(t=>{var n,r;s.push({store:t,usePart:null===(n=e.stores)||void 0===n?void 0:n.usePart,useProp:null===(r=e.stores)||void 0===r?void 0:r.useProp})}):s.push({store:e.stores.store,usePart:null===(r=e.stores)||void 0===r?void 0:r.usePart,useProp:null===(o=e.stores)||void 0===o?void 0:o.useProp})}return s})(e);return{created:e=>{const n=Object.keys(t);for(let o=0;o<n.length;o++){const{store:n,useProp:c,usePart:i}=t[o];if(n.$has(e))continue;const u=r(n),a=s(n,u,i?n.$key():"",c);e.setData(a),n.$bind(e,i,c)}},destroyed:e=>{const n=Object.keys(t);for(let o=0;o<n.length;o++){const{store:n,useProp:s,usePart:i}=t[o];if(i)e.setData({[n.$key()]:null});else{const t=r(n);let o;s&&(o=l(s,i?n.$key():""));const u=c(n,t,i?n.$key():"",o);e.setData(u)}n.$unbind(e)}},hasStore:t.length>0}};const g="[object Array]",b="[object Object]";function j(e,t){if(e===t)return;const n=v(e),r=v(t);if(n===b&&r===b){const n=e,r=t;for(const e in r){const t=n[e];void 0===t?n[e]=null:j(t,r[e])}}else n===g&&r===g&&e.length>=t.length&&t.forEach((t,n)=>{j(e[n],t)})}function O(e,t,n,r){if(e===t)return;const o=v(e),s=v(t);if(o===b)if(s!==b||Object.keys(e).length<Object.keys(t).length&&""!==n)w(r,n,e);else for(const o in e){const s=e[o],c=t[o],i=v(s),u=v(c),a=k(n,o);if(i!==g&&i!==b)s!==c&&w(r,a,s);else if(i===g)u!==g||s.length<c.length?w(r,a,s):s.forEach((e,t)=>{O(e,c[t],`${a}[${t}]`,r)});else if(i===b)if(u!==b||Object.keys(s).length<Object.keys(c).length)w(r,a,s);else for(const e in s){const t=k(a,e);O(s[e],c[e],t,r)}}else o===g?s!==g||e.length<t.length?w(r,n,e):e.forEach((e,o)=>{O(e,t[o],`${n}[${o}]`,r)}):w(r,n,e)}function P(e,t,n=""){if(!t)return e;const r={};return j(e,t),O(e,t,n,r),r}function k(e,t){return t.indexOf(".")>=0?e+`["${t}"]`:""===e?t:e+"."+t}function w(e,t,n){"[object Function]"!==v(n)&&(e[t]=n)}function v(e){return Object.prototype.toString.call(e)}const $=new WeakMap,m=new Map;let A=null;function S(e,t){if(!A)return;let n=$.get(e);n||(n=new Map,$.set(e,n));let r=n.get(t);r||(r=new Set,n.set(t,r)),r.add(A);let o=m.get(A);o||(o=new Set,m.set(A,o)),o.add(r)}function E(e,t){const n=$.get(e);if(!n)return;const r=n.get(t);r&&r.forEach(e=>e())}const M=e=>{const t=[];for(let n=0;n<e.length;n++){const r=e[n];if("string"!=typeof r)break;t.push(r)}return t.join(".")};function V(e){return function(e,t){const n=["push","pop","shift","unshift","splice","sort","reverse"];function r(e){return null!==e&&"object"==typeof e}function o(e){if("symbol"==typeof e)return String(e);const t=Number(e);return isNaN(t)?e:t}const s=new WeakMap,c=(e,i=[])=>{if(!r(e))return e;if(s.has(e))return s.get(e);const u=new Proxy(e,{set(e,n,r,s){const c=o(n),u=Reflect.get(e,n),a=Reflect.set(e,n,r,s);return t&&t({type:"set",path:[...i,c],oldValue:u,newValue:r,target:e}),a},get(e,s,u){const a=Reflect.get(e,s,u);if(Array.isArray(e)&&"function"==typeof a&&n.indexOf(String(s))>=0)return function(...n){const r=[...e],o=a.apply(e,n);return t&&t({type:"array-mutate",method:String(s),path:i,oldValue:r,newValue:[...e],target:e}),o};const l=o(s),f=[...i,l];return t&&t({type:"get",path:f,oldValue:a,target:e}),r(a)?c(a,[...i,l]):a},deleteProperty(e,n){const r=o(n),s=Reflect.get(e,n),c=Reflect.deleteProperty(e,n);return t&&t({type:"delete",path:[...i,r],oldValue:s,target:e}),c}});return Object.defineProperty(u,f,{value:function(){return e},enumerable:!1,configurable:!1,writable:!1}),s.set(e,u),u};return c(e)}(e,t=>{switch(t.type){case"array-mutate":case"delete":case"set":t.oldValue!==t.newValue&&E(e,M(t.path));break;case"get":S(e,M(t.path))}})}function x(e,t){let n,r=!0;A=()=>{r=!0,E(o,"value"),t(e())},e(),A=null;const o={get value(){return A&&S(o,"value"),r&&(n=e(),r=!1),n}};return o}function R(e,t,n,r){let o;o="function"==typeof t?t:()=>e[t];let s=o();if("function"==typeof s)throw new Error("watch source is not support a function");"object"==typeof s&&(s=p(s));const c=y(()=>{const e=p(o());d(s,e)||(n(e,s),s="object"==typeof e?p(e):e)},5);(null==r?void 0:r.immediate)&&n(s,s),A=c,o(),A=null;return()=>{const e=m.get(c);e&&(e.forEach(e=>e.delete(c)),m.delete(c))}}const D=new Map;exports.defineComponent=function(e){if(e.stores){const{created:t,destroyed:n,hasStore:r}=h(e);if(r){const{lifetimes:r={}}=e,o=r.created||e.created,s=r.detached||e.detached,c=r.attached||e.attached,i=function(){t(this),o&&o.call(this)},u=function(){t(this),c&&c.call(this)},a=function(){n(this),s&&s.call(this)};e.lifetimes=Object.assign(Object.assign({},r),{created:i,attached:u,detached:a})}}return Component(e)},exports.definePage=function(e){if(e.stores){const{created:t,destroyed:n,hasStore:r}=h(e);if(r){const r=e.onLoad,o=e.onUnload;e.onLoad=function(e){t(this),r&&r.call(this,e)},e.onUnload=function(){n(this),o&&o.call(this)}}}return Page(e)},exports.defineStore=function(o,c){return function(){if(D.has(o))return D.get(o);const{state:a,getters:f={},actions:d={}}=c,h=new Set,g=new Set,b=new Set,j=new Set,O=new WeakSet,k=new WeakMap,w=new WeakMap,v=a(),$=V(v);let m=n(v);const A=function(e,t=10){let n={},r={};const o=y(function(){e.call(this,n,r),n={},r={}},t);return function(e,t){Object.assign(n,e),Object.assign(r,t),o.call(this)}}((e,t)=>{j.forEach(t=>{O.has(t)?t.setData(i(e,o,k.get(t))):t.setData(u(e,k.get(t)))}),g.forEach(t=>{b.has(t)?t(i(e,o,w.get(t))):t(u(e,w.get(t)))});Object.keys(t).length>0&&(m=n(v),h.forEach(e=>e(t)))}),S=(t,n,r=e)=>{const o=P(p(t),m);if(!(Object.keys(o).length>0)&&!n)return;const s=i(o,r);n&&Object.assign(s,n),A(s,o)},E={$has:e=>j.has(e),$key:()=>o,$subscribe:e=>(h.add(e),()=>h.delete(e)),$watch:(e,t,n)=>R(E,e,t,n),$update:(e,t)=>{let n;g.add(e),(null==t?void 0:t.usePart)&&b.add(e),(null==t?void 0:t.useProp)&&(n=l(t.useProp,(null==t?void 0:t.usePart)?o:""),w.set(e,n));const c=r(E);return e(s(E,c,(null==t?void 0:t.usePart)?o:"",n)),()=>{g.delete(e),b.delete(e)}},$patch:e=>{const t=Object.assign(v,e);S(t)},$bind:(e,t,n)=>{j.add(e),t&&O.add(e),n&&k.set(e,l(n,t?o:""))},$unbind:e=>{j.delete(e),O.has(e)&&O.delete(e),k.has(e)&&k.delete(e)},$reset:()=>{const e=a();Object.assign($,e)},$dispose:()=>{E.$reset(),D.delete(o)}};return Object.keys($).forEach(e=>{Object.defineProperty(E,e,{configurable:!0,enumerable:!0,get:()=>$[e],set(t){$[e]=t,S($)}})}),Object.keys(d).forEach(e=>{const t=d[e];E[e]=function(...e){return t.apply(E,e)}}),Object.keys(f).forEach(e=>{if(!Object.prototype.hasOwnProperty.call(E,e)){const n=f[e],r=x(()=>n.call(E,$),n=>{S($,{[t+"."+e]:n})});Object.defineProperty(E,e,{get:()=>r.value,enumerable:!0,configurable:!1})}}),D.set(o,E),E}};