UNPKG

@sanity/ui-workshop

Version:

An environment for designing, reviewing, and quality-testing React components.

1 lines 24.6 kB
{"version":3,"file":"plugin-perf.cjs","sources":["../src/plugin-perf/PerfContext.ts","../src/plugin-perf/hooks/usePerf.ts","../src/plugin-perf/hooks/usePerfTest.tsx","../src/plugin-perf/PerfInspector.tsx","../src/plugin-perf/_runTest.ts","../src/plugin-perf/perfReducer.ts","../src/plugin-perf/PerfProvider.tsx","../src/plugin-perf/index.ts"],"sourcesContent":["import {createContext} from 'react'\n\nimport {PerfTest, PerfTestDetail, PerfTestRenderResult, PerfTestResult} from './types'\n\n/** @internal */\nexport interface PerfContextValue {\n activeTest?: string\n addRenderResult: (testName: string, result: PerfTestRenderResult) => void\n clearResults: (testName: string) => void\n registerTest: (test: PerfTest) => () => void\n results: PerfTestResult[]\n runTest: (testName: string) => void\n testDetails: PerfTestDetail[]\n tests: PerfTest[]\n}\n\n/** @internal */\nexport const PerfContext = createContext<PerfContextValue | null>(null)\n","import {useContext} from 'react'\n\nimport {PerfContext, PerfContextValue} from '../PerfContext'\n\n/** @internal */\nexport function usePerf(): PerfContextValue {\n const perf = useContext(PerfContext)\n\n if (!perf) {\n throw new Error('Perf: missing context value')\n }\n\n return perf\n}\n","import {memo, Profiler, useCallback, useEffect, useMemo, useRef} from 'react'\n\nimport {PerfTest, PerfTestRenderResult, PerfTestRunFn} from '../types'\nimport {usePerf} from './usePerf'\n\n/** @beta */\nexport interface PerfTestHookProps<TargetType = unknown> {\n ref: React.MutableRefObject<TargetType | null>\n Wrapper: React.ElementType<{children?: React.ReactNode}>\n}\n\n/** @beta */\nexport interface PerfTestProps<TargetType = unknown> {\n description?: string\n name: string\n run: PerfTestRunFn<TargetType>\n title?: string\n}\n\n/** @beta */\nexport function usePerfTest<TargetType = unknown>(\n props: PerfTestProps<TargetType>,\n): PerfTestHookProps<TargetType> {\n const {name, title, description, run} = props\n\n const {activeTest, addRenderResult, registerTest} = usePerf()\n const active = activeTest === name\n\n const ref = useRef<TargetType | null>(null)\n\n const test: PerfTest<TargetType> = useMemo(\n () => ({description, name, ref, run, title}),\n [description, name, ref, run, title],\n )\n\n const handleRender: React.ProfilerOnRenderCallback = useCallback(\n (id, phase, actualDuration, baseDuration, startTime, commitTime) => {\n const result: PerfTestRenderResult = {\n id,\n phase,\n actualDuration,\n baseDuration,\n startTime,\n commitTime,\n interactions: new Set(),\n }\n\n setTimeout(() => {\n // eslint-disable-next-line\n console.log('@todo: render', {addRenderResult, name, result})\n\n // @todo: this causes an infinite render-loop – why???\n // addRenderResult(name, result)\n }, 0)\n },\n [addRenderResult, name],\n )\n\n const Wrapper = useMemo(() => {\n return memo(\n // eslint-disable-next-line no-shadow\n function Wrapper({children}: {children?: React.ReactNode}): React.ReactNode {\n if (!active) {\n return <>{children}</>\n }\n\n return (\n <Profiler id={name} onRender={handleRender}>\n {children}\n </Profiler>\n )\n },\n )\n }, [active, handleRender, name])\n\n useEffect(() => registerTest(test as PerfTest<unknown>), [registerTest, test])\n\n return useMemo(() => ({ref, Wrapper}), [ref, Wrapper])\n}\n","import {PlayIcon, TrashIcon} from '@sanity/icons'\nimport {Box, Button, Card, Flex, Stack, Text} from '@sanity/ui'\nimport {memo} from 'react'\n\nimport {usePerf} from './hooks'\n\n/** @internal */\nexport const PerfInspector = memo(function PerfInspector(): React.ReactNode {\n const {clearResults, results, runTest, testDetails} = usePerf()\n\n if (testDetails.length === 0) {\n return (\n <Box padding={2}>\n <Box padding={2}>\n <Text muted size={[2, 2, 1]}>\n No tests\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Stack padding={2} space={2}>\n {testDetails.map((detail) => {\n const testResults = results.filter((r) => r.name === detail.name)\n\n return (\n <Card border key={detail.name} overflow=\"hidden\" radius={2} style={{lineHeight: 0}}>\n <Flex>\n <Stack flex={1} padding={2} space={2}>\n <Text size={1} weight=\"semibold\">\n {detail.title || detail.name}\n </Text>\n {detail.description && (\n <Text muted size={1}>\n {detail.description}\n </Text>\n )}\n </Stack>\n <Flex align=\"flex-start\" gap={1} padding={1}>\n <Button\n aria-label=\"Clear results\"\n fontSize={1}\n icon={TrashIcon}\n mode=\"bleed\"\n onClick={() => clearResults(detail.name)}\n padding={1}\n />\n </Flex>\n </Flex>\n\n <Stack>\n {testResults.map((result, resultIndex) => (\n <Card borderTop key={resultIndex}>\n <Stack>\n {result.renders.map((r, rIdx) => {\n return <Card key={rIdx}>{r.phase}</Card>\n })}\n </Stack>\n\n <Flex padding={2}>\n <Box flex={1}>\n <Text muted size={1}>\n {result.timing?.runs} runs\n </Text>\n </Box>\n\n <Box>\n <Text size={1}>Avg. {result.timing?.avgDuration.toFixed(3)}ms</Text>\n </Box>\n </Flex>\n </Card>\n ))}\n\n <Card borderTop>\n <Stack>\n <Button\n aria-label=\"Run\"\n fontSize={1}\n icon={PlayIcon}\n mode=\"bleed\"\n onClick={() => runTest(detail.name)}\n padding={2}\n radius={0}\n />\n </Stack>\n </Card>\n </Stack>\n </Card>\n )\n })}\n </Stack>\n )\n})\n","import {PerfTest} from './types'\n\nfunction delay(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/** @internal */\nexport async function _runTest(\n test: PerfTest,\n target: unknown,\n): Promise<{\n avgDuration: number\n sumDuration: number\n runs: number\n}> {\n // // Do a run to heat up the browser\n // await test.run({target})\n\n const runs = 1\n\n performance.clearMarks()\n performance.clearMeasures()\n\n for (let i = 0; i < runs; i += 1) {\n performance.mark(`start:${test.name}`)\n\n await test.run({target})\n\n performance.mark(`end:${test.name}`)\n performance.measure(test.name, `start:${test.name}`, `end:${test.name}`)\n\n // sleep\n await delay(100)\n }\n\n const perfEntries = performance.getEntriesByName(test.name)\n const sumDuration = perfEntries.reduce((t, e) => t + e.duration, 0)\n const avgDuration = sumDuration / runs\n\n return {avgDuration, sumDuration, runs}\n}\n","import {WorkshopMsg} from '@sanity/ui-workshop'\n\nimport {PerfMsg} from './msg'\nimport {PerfState} from './types'\n\n/** @internal */\nexport function perfReducer(state: PerfState, msg: PerfMsg | WorkshopMsg): PerfState {\n if (msg.type === 'workshop/perf/clearResults') {\n return {...state, results: state.results.filter((d) => d.name !== msg.name)}\n }\n\n if (msg.type === 'workshop/perf/registerTest') {\n return {\n ...state,\n testDetails: state.testDetails.concat([\n {\n description: msg.description,\n name: msg.name,\n title: msg.title,\n },\n ]),\n }\n }\n\n if (msg.type === 'workshop/perf/unregisterTest') {\n return {...state, testDetails: state.testDetails.filter((d) => d.name !== msg.name)}\n }\n\n if (msg.type === 'workshop/perf/runTest') {\n return {\n ...state,\n activeTest: msg.name,\n results: state.results.concat([\n {\n name: msg.name,\n renders: [],\n },\n ]),\n }\n }\n\n if (msg.type === 'workshop/perf/addResult') {\n if (state.activeTest === msg.name) {\n const result = state.results.filter((r) => r.name === msg.name)\n const lastResult = result[result.length - 1]\n\n if (lastResult) {\n return {\n ...state,\n results: state.results.map((r) => {\n if (r === lastResult) {\n return {...r, timing: msg.result}\n }\n\n return r\n }),\n }\n }\n }\n\n return state\n }\n\n if (msg.type === 'workshop/perf/addRenderResult') {\n if (state.activeTest === msg.name) {\n const result = state.results.filter((r) => r.name === msg.name)\n const lastResult = result[result.length - 1]\n\n if (lastResult) {\n return {\n ...state,\n results: state.results.map((r) => {\n if (r === lastResult) {\n return {...r, renders: r.renders.concat([msg.result])}\n }\n\n return r\n }),\n }\n }\n }\n\n return state\n }\n\n return state\n}\n","import {useWorkshop} from '@sanity/ui-workshop'\nimport {memo, useCallback, useEffect, useMemo, useState} from 'react'\n\nimport {_runTest} from './_runTest'\nimport {PerfMsg} from './msg'\nimport {PerfContext, PerfContextValue} from './PerfContext'\nimport {perfReducer} from './perfReducer'\nimport {PerfState, PerfTest, PerfTestRenderResult} from './types'\n\n/** @internal */\nexport const PerfProvider = memo(function PerfProvider(props: {\n children?: React.ReactNode\n}): React.ReactNode {\n const {children} = props\n const {broadcast, channel} = useWorkshop<PerfMsg>()\n const [{activeTest, results, testDetails, tests}, setState] = useState<PerfState>({\n results: [],\n testDetails: [],\n tests: [],\n })\n\n const addRenderResult = useCallback(\n (name: string, result: PerfTestRenderResult) => {\n broadcast({type: 'workshop/perf/addRenderResult', name, result})\n },\n [broadcast],\n )\n\n const clearResults = useCallback(\n (name: string) => {\n broadcast({type: 'workshop/perf/clearResults', name})\n },\n [broadcast],\n )\n\n const registerTest = useCallback(\n (test: PerfTest) => {\n broadcast({\n type: 'workshop/perf/registerTest',\n description: test.description,\n title: test.title,\n name: test.name,\n })\n\n setState((s) => ({...s, tests: s.tests.concat([test])}))\n\n return () => {\n broadcast({type: 'workshop/perf/unregisterTest', name: test.name})\n setState((s) => ({...s, tests: s.tests.filter((t) => t !== test)}))\n }\n },\n [broadcast],\n )\n\n const runTest = useCallback(\n (testName: string) => {\n broadcast({type: 'workshop/perf/runTest', name: testName})\n },\n [broadcast],\n )\n\n const perf: PerfContextValue = useMemo(\n () => ({\n activeTest,\n addRenderResult,\n clearResults,\n registerTest,\n results,\n runTest,\n testDetails,\n tests,\n }),\n [activeTest, addRenderResult, clearResults, registerTest, results, runTest, testDetails, tests],\n )\n\n useEffect(() => {\n return channel.subscribe((msg) => {\n setState((s) => perfReducer(s, msg))\n\n if (msg.type === 'workshop/perf/runTest') {\n setTimeout(() => {\n const test = tests.find((t) => t.name === msg.name)\n\n if (test) {\n const container = test.ref.current\n\n if (container !== null) {\n _runTest(test, container)\n .then((result) => {\n broadcast({\n type: 'workshop/perf/addResult',\n name: test.name,\n result,\n })\n })\n .catch((err) => {\n // eslint-disable-next-line no-console\n console.error(err)\n })\n }\n }\n }, 0)\n\n return\n }\n })\n }, [broadcast, channel, tests])\n\n return <PerfContext.Provider value={perf}>{children}</PerfContext.Provider>\n})\n","export type {PerfContextValue} from './PerfContext'\nimport {WorkshopPlugin} from '@sanity/ui-workshop'\n\nimport {PerfInspector} from './PerfInspector'\nimport {PerfProvider} from './PerfProvider'\n\nexport * from './hooks'\nexport * from './types'\n\n/** @internal */\nexport function perfPlugin(): WorkshopPlugin {\n return {\n name: 'perf',\n title: 'Performance',\n inspector: PerfInspector,\n provider: PerfProvider,\n }\n}\n"],"names":["PerfContext","createContext","usePerf","perf","useContext","Error","usePerfTest","props","$","_c","name","title","description","run","activeTest","addRenderResult","registerTest","active","ref","useRef","t0","t1","test","t2","id","phase","actualDuration","baseDuration","startTime","commitTime","result","interactions","Set","setTimeout","console","log","handleRender","t3","t4","memo","Wrapper","t5","children","jsx","Profiler","Fragment","t6","useEffect","t7","t8","PerfInspector","clearResults","results","runTest","testDetails","length","Symbol","for","Box","Text","detail","testResults","filter","r","jsxs","Card","lineHeight","Flex","Stack","Button","TrashIcon","map","_temp2","PlayIcon","_temp","r_0","rIdx","resultIndex","renders","timing","runs","avgDuration","toFixed","delay","ms","Promise","resolve","_runTest","target","clearMarks","performance","clearMeasures","i","mark","measure","sumDuration","getEntriesByName","reduce","t","e","duration","perfReducer","state","msg","type","d","concat","lastResult","PerfProvider","broadcast","channel","useWorkshop","tests","setState","useState","name_0","s","s_0","testName","t9","subscribe","s_1","test_0","find","t_0","container","current","then","result_0","catch","t10","err","error","perfPlugin","inspector","provider"],"mappings":"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"}