use-reactive-object
Version:
React hook for creating reactive objects.
2 lines (1 loc) • 1.76 kB
JavaScript
import{useReducer as t,useRef as e}from"react";const n=t=>!(t=>null==t)(t)&&(t=>"object"==typeof t)(t)&&!(t=>t instanceof Date)(t);function o(t,e,r,c=[]){const a=t=>c.concat(t).join("."),i=new WeakMap;let f=0;const s=new Proxy(t,{set(t,n,o){const r=a(n);return e({path:r,target:t,newValue:o,previousValue:Reflect.get(t,n,o)}),Reflect.set(t,n,o)},get(t,s,u){var l,p;const y=Reflect.get(t,s,u);if("function"==typeof y&&function(t){return t instanceof Map||t instanceof Set||t instanceof WeakMap||t instanceof WeakSet||t instanceof Date||t instanceof RegExp||t instanceof ArrayBuffer||t instanceof DataView||ArrayBuffer.isView(t)||t instanceof Promise||t instanceof Error}(t))return y.bind(t);if(!n(y)||Object.isFrozen(y))return y;const g=i.get(y);if(g)return g;const h=a(s);if(r){if(r.level&&(f=f||(h.match(/\./g)||[]).length+1,f===r.level))return y;if(!(null===(p=null===(l=r.filter)||void 0===l?void 0:l.call(r,{path:h,target:t,value:y}))||void 0===p||p))return y}const v=o(y,e,r,c.concat(s));return i.set(y,v),v}});return s.onProxy&&"function"==typeof s.onProxy&&s.onProxy(s),s}function r(n,r){const[,c]=t((()=>Math.random()),0),a=e(),i=e();if(!i.current){a.current=new Map;const t="function"==typeof n?n():n;i.current=o(t,(t=>{a.current.get(t.path)!==t.newValue&&((null==r?void 0:r.intercept)?r.intercept((()=>c()),t):c(),a.current.set(t.path,t.newValue))}),r)}return i.current}class c{onProxy(t){let e=Object.getPrototypeOf(this);for(;e&&e!==Object.prototype;){for(const n of Object.getOwnPropertyNames(e)){const o=Object.getOwnPropertyDescriptor(e,n);o&&"function"==typeof o.value&&"constructor"!==n&&(this[n]=this[n].bind(t))}e=Object.getPrototypeOf(e)}}}export{c as ReactiveObject,o as buildProxy,r as default};//# sourceMappingURL=index.esm.mjs.map