{
  "version": 3,
  "sources": ["../../src/hooks/useRenderSpinCheck.tsx", "../../src/components/RenderSpinCheck.tsx"],
  "sourcesContent": ["import {\n  useEffect, useRef, useState,\n} from 'react'\n\nexport interface RenderSpinCheckConfig {\n  maxRate?: number\n  minSamples?: number\n  noThrow?: boolean\n  reportOnce?: boolean\n}\n\nexport interface RenderSpinCheckBounce {\n  name: string\n}\n\n// this is external to prevent us from creating our own spin\nconst spinCountMap = new Map<number, number>()\n\nexport const useRenderSpinCheck = (bounce: RenderSpinCheckBounce, config?: RenderSpinCheckConfig) => {\n  const [startTime] = useState(() => Date.now())\n  const errorRef = useRef<Error>(undefined)\n\n  useEffect(() => {\n    const error = errorRef.current\n    if (error) {\n      if (!config?.reportOnce) {\n        console.warn(error.message)\n      }\n    } else {\n      const spinCount = spinCountMap.get(startTime) ?? 0\n      if (spinCount > (config?.minSamples ?? 20)) {\n        const elapsedTime = Date.now() - startTime\n        const refreshRate = elapsedTime / spinCount\n        if (refreshRate < (config?.maxRate ?? 1000)) {\n          const newError = new Error(`Spinning [${bounce.name}] [Rate=${refreshRate.toFixed(2)}ms, Samples=${spinCount}]`)\n          console.warn(newError.message)\n          errorRef.current = newError\n          if (!config?.noThrow) {\n            throw newError\n          }\n        }\n      }\n      spinCountMap.set(startTime, spinCount + 1)\n    }\n\n    return () => {\n      spinCountMap.delete(startTime)\n    }\n  }, [bounce, config, startTime])\n}\n", "import type { RenderSpinCheckBounce, RenderSpinCheckConfig } from '../hooks/index.ts'\nimport { useRenderSpinCheck } from '../hooks/index.ts'\n\nexport type RenderSpinCheckProps = {\n  bounce: RenderSpinCheckBounce\n} & RenderSpinCheckConfig\n\nexport const RenderSpinCheck: React.FC<RenderSpinCheckProps> = ({\n  minSamples = 20, bounce, maxRate = 1000, noThrow = false, reportOnce,\n}) => {\n  useRenderSpinCheck(bounce, {\n    maxRate, minSamples, noThrow, reportOnce,\n  })\n\n  return null\n}\n"],
  "mappings": ";AAAA;AAAA,EACE;AAAA,EAAW;AAAA,EAAQ;AAAA,OACd;AAcP,IAAM,eAAe,oBAAI,IAAoB;AAEtC,IAAM,qBAAqB,CAAC,QAA+B,WAAmC;AACnG,QAAM,CAAC,SAAS,IAAI,SAAS,MAAM,KAAK,IAAI,CAAC;AAC7C,QAAM,WAAW,OAAc,MAAS;AAExC,YAAU,MAAM;AACd,UAAM,QAAQ,SAAS;AACvB,QAAI,OAAO;AACT,UAAI,CAAC,QAAQ,YAAY;AACvB,gBAAQ,KAAK,MAAM,OAAO;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,YAAM,YAAY,aAAa,IAAI,SAAS,KAAK;AACjD,UAAI,aAAa,QAAQ,cAAc,KAAK;AAC1C,cAAM,cAAc,KAAK,IAAI,IAAI;AACjC,cAAM,cAAc,cAAc;AAClC,YAAI,eAAe,QAAQ,WAAW,MAAO;AAC3C,gBAAM,WAAW,IAAI,MAAM,aAAa,OAAO,IAAI,WAAW,YAAY,QAAQ,CAAC,CAAC,eAAe,SAAS,GAAG;AAC/G,kBAAQ,KAAK,SAAS,OAAO;AAC7B,mBAAS,UAAU;AACnB,cAAI,CAAC,QAAQ,SAAS;AACpB,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,mBAAa,IAAI,WAAW,YAAY,CAAC;AAAA,IAC3C;AAEA,WAAO,MAAM;AACX,mBAAa,OAAO,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,SAAS,CAAC;AAChC;;;AC1CO,IAAM,kBAAkD,CAAC;AAAA,EAC9D,aAAa;AAAA,EAAI;AAAA,EAAQ,UAAU;AAAA,EAAM,UAAU;AAAA,EAAO;AAC5D,MAAM;AACJ,qBAAmB,QAAQ;AAAA,IACzB;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,EAChC,CAAC;AAED,SAAO;AACT;",
  "names": []
}
