UNPKG

use-why-rerender

Version:

A React hook to track and debug prop changes in components

2 lines (1 loc) 2.02 kB
"use strict";var e=require("react");let r;exports.useWhyRerender=function(t,n={}){const{deep:o=!1,enabled:c=!0,debounceMs:a=0,caller:l}=n,u=e.useRef(t),s=e.useRef(0),p=e.useRef(null),d=e.useCallback((()=>{null!==p.current&&(window.clearTimeout(p.current),p.current=null)}),[]),f=e.useCallback(((e,r)=>{c&&(Object.keys(e).length>0?(console.group(`🔄 Render #${s.current} ${l?`from ${l}`:""}`),Object.entries(e).forEach((([e,t])=>{t.meta.recreated&&t.meta.equal?console.warn(`${e}: Object reference changed but ${r?"deeply":"shallowly"} equal`):("value"!==t.meta.type&&"object"!==t.meta.type||t.meta.recreated)&&"error"===t.meta.type?console.warn(`${e}:`,t.meta.error):(console.group(`${e}:`),console.log("prev:",t.meta.prev),console.log("next:",t.meta.next),console.groupEnd())})),console.groupEnd()):console.log(`❓ Render #${s.current} ${l?`from ${l} `:""}- No tracked props changed`))}),[c,l]);e.useEffect((()=>{o&&!r&&import("react-fast-compare").then((e=>{r=e.default})).catch((e=>{console.error("Failed to load deep comparison function:",e)}))}),[o]),e.useEffect((()=>{if(c){try{s.current++;const e={};Object.entries(t).forEach((([t,n])=>{const c=u.current[t];if(c!==n){const a=function(e,t,n){const o=e!==t;if(null==e||null==t)return o?{meta:{prev:e,next:t,type:"value",recreated:o,equal:e===t}}:null;if("object"==typeof e&&null!==e&&"object"==typeof t&&null!==t){if(!n){const r=Object.keys(e).every((r=>e[r]===t[r]));return{meta:{prev:e,next:t,type:"object",recreated:o,equal:r}}}try{let n;if(!r)throw new Error("Fast deep equal function not loaded");return n=r(e,t),{meta:{prev:e,next:t,type:"object",recreated:o,equal:n}}}catch(r){return{meta:{prev:e,next:t,type:"error",recreated:o,equal:!1,error:r instanceof Error?r.message:"Deep comparison failed"}}}}return{meta:{prev:e,next:t,type:"value",recreated:o,equal:e==t}}}(c,n,o);a&&(e[t]=a)}})),a>0?(d(),p.current=window.setTimeout((()=>{f(e,o)}),a)):f(e,o),u.current=t}catch(e){console.error("useWhyRerender encountered an error:",e)}return d}}),[t,c,o,a,f,d])};