@tanstack/react-query-devtools 4.26.1 → 4.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/build/lib/Explorer.esm.js +1 -0
  2. package/build/lib/Explorer.esm.js.map +1 -1
  3. package/build/lib/Explorer.js +1 -0
  4. package/build/lib/Explorer.js.map +1 -1
  5. package/build/lib/Explorer.mjs +1 -0
  6. package/build/lib/Explorer.mjs.map +1 -1
  7. package/build/lib/devtools.d.ts +23 -2
  8. package/build/lib/devtools.esm.js +108 -8
  9. package/build/lib/devtools.esm.js.map +1 -1
  10. package/build/lib/devtools.js +107 -8
  11. package/build/lib/devtools.js.map +1 -1
  12. package/build/lib/devtools.mjs +108 -8
  13. package/build/lib/devtools.mjs.map +1 -1
  14. package/build/lib/index.esm.js +1 -0
  15. package/build/lib/index.esm.js.map +1 -1
  16. package/build/lib/index.js +1 -0
  17. package/build/lib/index.js.map +1 -1
  18. package/build/lib/index.mjs +1 -0
  19. package/build/lib/index.mjs.map +1 -1
  20. package/build/lib/index.prod.esm.js +110 -9
  21. package/build/lib/index.prod.esm.js.map +1 -1
  22. package/build/lib/index.prod.js +109 -9
  23. package/build/lib/index.prod.js.map +1 -1
  24. package/build/lib/index.prod.mjs +110 -9
  25. package/build/lib/index.prod.mjs.map +1 -1
  26. package/build/lib/styledComponents.esm.js +3 -1
  27. package/build/lib/styledComponents.esm.js.map +1 -1
  28. package/build/lib/styledComponents.js +3 -1
  29. package/build/lib/styledComponents.js.map +1 -1
  30. package/build/lib/styledComponents.mjs +3 -1
  31. package/build/lib/styledComponents.mjs.map +1 -1
  32. package/build/lib/theme.esm.js +1 -0
  33. package/build/lib/theme.esm.js.map +1 -1
  34. package/build/lib/theme.js +1 -0
  35. package/build/lib/theme.js.map +1 -1
  36. package/build/lib/theme.mjs +1 -0
  37. package/build/lib/theme.mjs.map +1 -1
  38. package/build/umd/index.development.js +109 -9
  39. package/build/umd/index.development.js.map +1 -1
  40. package/package.json +3 -3
  41. package/src/__tests__/devtools.test.tsx +139 -0
  42. package/src/devtools.tsx +144 -2
  43. package/src/styledComponents.ts +3 -1
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\nimport { useSyncExternalStore } from './useSyncExternalStore'\nimport type {\n QueryCache,\n QueryClient,\n QueryKey as QueryKeyType,\n ContextOptions,\n} from '@tanstack/react-query'\nimport {\n useQueryClient,\n onlineManager,\n notifyManager,\n} from '@tanstack/react-query'\nimport { rankItem } from '@tanstack/match-sorter-utils'\nimport useLocalStorage from './useLocalStorage'\nimport {\n isVerticalSide,\n sortFns,\n useIsMounted,\n getSidePanelStyle,\n minPanelSize,\n getResizeHandleStyle,\n getSidedProp,\n defaultPanelSize,\n displayValue,\n} from './utils'\nimport type { Corner, Side } from './utils'\nimport {\n Panel,\n QueryKeys,\n QueryKey,\n Button,\n Code,\n Input,\n Select,\n ActiveQueryPanel,\n} from './styledComponents'\nimport ScreenReader from './screenreader'\nimport { ThemeProvider, defaultTheme as theme } from './theme'\nimport { getQueryStatusLabel, getQueryStatusColor } from './utils'\nimport Explorer from './Explorer'\nimport Logo from './Logo'\n\nexport interface DevtoolsOptions extends ContextOptions {\n /**\n * Set this true if you want the dev tools to default to being open\n */\n initialIsOpen?: boolean\n /**\n * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc.\n */\n panelProps?: React.ComponentPropsWithoutRef<'div'>\n /**\n * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n closeButtonProps?: React.ComponentPropsWithoutRef<'button'>\n /**\n * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n toggleButtonProps?: React.ComponentPropsWithoutRef<'button'>\n /**\n * The position of the React Query logo to open and close the devtools panel.\n * Defaults to 'bottom-left'.\n */\n position?: Corner\n /**\n * The position of the React Query devtools panel.\n * Defaults to 'bottom'.\n */\n panelPosition?: Side\n /**\n * Use this to render the devtools inside a different type of container element for a11y purposes.\n * Any string which corresponds to a valid intrinsic JSX element is allowed.\n * Defaults to 'aside'.\n */\n containerElement?: string | any\n /**\n * nonce for style element for CSP\n */\n styleNonce?: string\n}\n\ninterface DevtoolsPanelOptions extends ContextOptions {\n /**\n * The standard React style object used to style a component with inline styles\n */\n style?: React.CSSProperties\n /**\n * The standard React className property used to style a component with classes\n */\n className?: string\n /**\n * A boolean variable indicating whether the panel is open or closed\n */\n isOpen?: boolean\n /**\n * nonce for style element for CSP\n */\n styleNonce?: string\n /**\n * A function that toggles the open and close state of the panel\n */\n setIsOpen: (isOpen: boolean) => void\n /**\n * Handles the opening and closing the devtools panel\n */\n onDragStart: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n /**\n * The position of the React Query devtools panel.\n * Defaults to 'bottom'.\n */\n position?: Side\n /**\n * Handles the panel position select change\n */\n onPositionChange?: (side: Side) => void\n /**\n * Show a close button inside the panel\n */\n showCloseButton?: boolean\n /**\n * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n closeButtonProps?: React.ComponentPropsWithoutRef<'button'>\n}\n\nexport function ReactQueryDevtools({\n initialIsOpen,\n panelProps = {},\n closeButtonProps = {},\n toggleButtonProps = {},\n position = 'bottom-left',\n containerElement: Container = 'aside',\n context,\n styleNonce,\n panelPosition: initialPanelPosition = 'bottom',\n}: DevtoolsOptions): React.ReactElement | null {\n const rootRef = React.useRef<HTMLDivElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [isOpen, setIsOpen] = useLocalStorage(\n 'reactQueryDevtoolsOpen',\n initialIsOpen,\n )\n const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage<number>(\n 'reactQueryDevtoolsHeight',\n defaultPanelSize,\n )\n const [devtoolsWidth, setDevtoolsWidth] = useLocalStorage<number>(\n 'reactQueryDevtoolsWidth',\n defaultPanelSize,\n )\n\n const [panelPosition = 'bottom', setPanelPosition] = useLocalStorage<Side>(\n 'reactQueryDevtoolsPanelPosition',\n initialPanelPosition,\n )\n\n const [isResolvedOpen, setIsResolvedOpen] = React.useState(false)\n const [isResizing, setIsResizing] = React.useState(false)\n const isMounted = useIsMounted()\n\n const handleDragStart = (\n panelElement: HTMLDivElement | null,\n startEvent: React.MouseEvent<HTMLDivElement, MouseEvent>,\n ) => {\n if (!panelElement) return\n if (startEvent.button !== 0) return // Only allow left click for drag\n const isVertical = isVerticalSide(panelPosition)\n setIsResizing(true)\n\n const { height, width } = panelElement.getBoundingClientRect()\n const startX = startEvent.clientX\n const startY = startEvent.clientY\n let newSize = 0\n\n const run = (moveEvent: MouseEvent) => {\n // prevent mouse selecting stuff with mouse drag\n moveEvent.preventDefault()\n\n // calculate the correct size based on mouse position and current panel position\n // hint: it is different formula for the opposite sides\n if (isVertical) {\n newSize =\n width +\n (panelPosition === 'right'\n ? startX - moveEvent.clientX\n : moveEvent.clientX - startX)\n setDevtoolsWidth(newSize)\n } else {\n newSize =\n height +\n (panelPosition === 'bottom'\n ? startY - moveEvent.clientY\n : moveEvent.clientY - startY)\n setDevtoolsHeight(newSize)\n }\n\n if (newSize < minPanelSize) {\n setIsOpen(false)\n } else {\n setIsOpen(true)\n }\n }\n\n const unsub = () => {\n if (isResizing) {\n setIsResizing(false)\n }\n\n document.removeEventListener('mousemove', run, false)\n document.removeEventListener('mouseUp', unsub, false)\n }\n\n document.addEventListener('mousemove', run, false)\n document.addEventListener('mouseup', unsub, false)\n }\n\n React.useEffect(() => {\n setIsResolvedOpen(isOpen ?? false)\n }, [isOpen, isResolvedOpen, setIsResolvedOpen])\n\n // Toggle panel visibility before/after transition (depending on direction).\n // Prevents focusing in a closed panel.\n React.useEffect(() => {\n const ref = panelRef.current\n if (ref) {\n const handlePanelTransitionStart = () => {\n if (isResolvedOpen) {\n ref.style.visibility = 'visible'\n }\n }\n\n const handlePanelTransitionEnd = () => {\n if (!isResolvedOpen) {\n ref.style.visibility = 'hidden'\n }\n }\n\n ref.addEventListener('transitionstart', handlePanelTransitionStart)\n ref.addEventListener('transitionend', handlePanelTransitionEnd)\n\n return () => {\n ref.removeEventListener('transitionstart', handlePanelTransitionStart)\n ref.removeEventListener('transitionend', handlePanelTransitionEnd)\n }\n }\n return\n }, [isResolvedOpen])\n\n React.useEffect(() => {\n if (isResolvedOpen && rootRef.current?.parentElement) {\n const { parentElement } = rootRef.current\n const styleProp = getSidedProp('padding', panelPosition)\n const isVertical = isVerticalSide(panelPosition)\n\n const previousPaddings = (({\n padding,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n }) => ({\n padding,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n }))(parentElement.style)\n\n const run = () => {\n // reset the padding\n parentElement.style.padding = '0px'\n parentElement.style.paddingTop = '0px'\n parentElement.style.paddingBottom = '0px'\n parentElement.style.paddingLeft = '0px'\n parentElement.style.paddingRight = '0px'\n // set the new padding based on the new panel position\n\n parentElement.style[styleProp] = `${\n isVertical ? devtoolsWidth : devtoolsHeight\n }px`\n }\n\n run()\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', run)\n\n return () => {\n window.removeEventListener('resize', run)\n Object.entries(previousPaddings).forEach(\n ([property, previousValue]) => {\n parentElement.style[property as keyof typeof previousPaddings] =\n previousValue\n },\n )\n }\n }\n }\n return\n }, [isResolvedOpen, panelPosition, devtoolsHeight, devtoolsWidth])\n\n const { style: panelStyle = {}, ...otherPanelProps } = panelProps\n\n const {\n style: toggleButtonStyle = {},\n onClick: onToggleClick,\n ...otherToggleButtonProps\n } = toggleButtonProps\n\n // get computed style based on panel position\n const style = getSidePanelStyle({\n position: panelPosition,\n devtoolsTheme: theme,\n isOpen: isResolvedOpen,\n height: devtoolsHeight,\n width: devtoolsWidth,\n isResizing,\n panelStyle,\n })\n\n // Do not render on the server\n if (!isMounted()) return null\n\n return (\n <Container\n ref={rootRef}\n className=\"ReactQueryDevtools\"\n aria-label=\"React Query Devtools\"\n >\n <ThemeProvider theme={theme}>\n <ReactQueryDevtoolsPanel\n ref={panelRef as any}\n context={context}\n styleNonce={styleNonce}\n position={panelPosition}\n onPositionChange={setPanelPosition}\n showCloseButton\n closeButtonProps={closeButtonProps}\n {...otherPanelProps}\n style={style}\n isOpen={isResolvedOpen}\n setIsOpen={setIsOpen}\n onDragStart={(e) => handleDragStart(panelRef.current, e)}\n />\n </ThemeProvider>\n {!isResolvedOpen ? (\n <button\n type=\"button\"\n {...otherToggleButtonProps}\n aria-label=\"Open React Query Devtools\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n onClick={(e) => {\n setIsOpen(true)\n onToggleClick?.(e)\n }}\n style={{\n background: 'none',\n border: 0,\n padding: 0,\n position: 'fixed',\n zIndex: 99999,\n display: 'inline-flex',\n fontSize: '1.5em',\n margin: '.5em',\n cursor: 'pointer',\n width: 'fit-content',\n ...(position === 'top-right'\n ? {\n top: '0',\n right: '0',\n }\n : position === 'top-left'\n ? {\n top: '0',\n left: '0',\n }\n : position === 'bottom-right'\n ? {\n bottom: '0',\n right: '0',\n }\n : {\n bottom: '0',\n left: '0',\n }),\n ...toggleButtonStyle,\n }}\n >\n <Logo aria-hidden />\n <ScreenReader text=\"Open React Query Devtools\" />\n </button>\n ) : null}\n </Container>\n )\n}\n\nconst useSubscribeToQueryCache = <T,>(\n queryCache: QueryCache,\n getSnapshot: () => T,\n skip: boolean = false,\n): T => {\n return useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n if (!skip)\n return queryCache.subscribe(notifyManager.batchCalls(onStoreChange))\n return () => {\n return\n }\n },\n [queryCache, skip],\n ),\n getSnapshot,\n getSnapshot,\n )\n}\n\nexport const ReactQueryDevtoolsPanel = React.forwardRef<\n HTMLDivElement,\n DevtoolsPanelOptions\n>(function ReactQueryDevtoolsPanel(props, ref): React.ReactElement {\n const {\n isOpen = true,\n styleNonce,\n setIsOpen,\n context,\n onDragStart,\n onPositionChange,\n showCloseButton,\n position,\n closeButtonProps = {},\n ...panelProps\n } = props\n\n const { onClick: onCloseClick, ...otherCloseButtonProps } = closeButtonProps\n\n const queryClient = useQueryClient({ context })\n const queryCache = queryClient.getQueryCache()\n\n const [sort, setSort] = useLocalStorage(\n 'reactQueryDevtoolsSortFn',\n Object.keys(sortFns)[0],\n )\n\n const [filter, setFilter] = useLocalStorage('reactQueryDevtoolsFilter', '')\n\n const [baseSort, setBaseSort] = useLocalStorage(\n 'reactQueryDevtoolsBaseSort',\n 1,\n )\n\n const sortFn = React.useMemo(() => sortFns[sort as string], [sort])\n\n const queriesCount = useSubscribeToQueryCache(\n queryCache,\n () => queryCache.getAll().length,\n !isOpen,\n )\n\n const [activeQueryHash, setActiveQueryHash] = useLocalStorage(\n 'reactQueryDevtoolsActiveQueryHash',\n '',\n )\n\n const queries = React.useMemo(() => {\n const unsortedQueries = queryCache.getAll()\n\n if (queriesCount === 0) {\n return []\n }\n\n const filtered = filter\n ? unsortedQueries.filter(\n (item) => rankItem(item.queryHash, filter).passed,\n )\n : [...unsortedQueries]\n\n const sorted = sortFn\n ? filtered.sort((a, b) => sortFn(a, b) * (baseSort as number))\n : filtered\n\n return sorted\n }, [baseSort, sortFn, filter, queriesCount, queryCache])\n\n const [isMockOffline, setMockOffline] = React.useState(false)\n\n return (\n <ThemeProvider theme={theme}>\n <Panel\n ref={ref}\n className=\"ReactQueryDevtoolsPanel\"\n aria-label=\"React Query Devtools Panel\"\n id=\"ReactQueryDevtoolsPanel\"\n {...panelProps}\n style={{\n height: defaultPanelSize,\n position: 'relative',\n ...panelProps.style,\n }}\n >\n <style\n nonce={styleNonce}\n dangerouslySetInnerHTML={{\n __html: `\n .ReactQueryDevtoolsPanel * {\n scrollbar-color: ${theme.backgroundAlt} ${theme.gray};\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar, .ReactQueryDevtoolsPanel scrollbar {\n width: 1em;\n height: 1em;\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar-track, .ReactQueryDevtoolsPanel scrollbar-track {\n background: ${theme.backgroundAlt};\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactQueryDevtoolsPanel scrollbar-thumb {\n background: ${theme.gray};\n border-radius: .5em;\n border: 3px solid ${theme.backgroundAlt};\n }\n `,\n }}\n />\n <div\n style={getResizeHandleStyle(position)}\n onMouseDown={onDragStart}\n ></div>\n\n {isOpen && (\n <div\n style={{\n flex: '1 1 500px',\n minHeight: '40%',\n maxHeight: '100%',\n overflow: 'auto',\n borderRight: `1px solid ${theme.grayAlt}`,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n padding: '.5em',\n background: theme.backgroundAlt,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close React Query Devtools\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"true\"\n onClick={() => setIsOpen(false)}\n style={{\n display: 'inline-flex',\n background: 'none',\n border: 0,\n padding: 0,\n marginRight: '.5em',\n cursor: 'pointer',\n }}\n >\n <Logo aria-hidden />\n <ScreenReader text=\"Close React Query Devtools\" />\n </button>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '.5em',\n }}\n >\n <QueryStatusCount queryCache={queryCache} />\n {position && onPositionChange ? (\n <Select\n aria-label=\"Panel position\"\n value={position}\n style={{ marginInlineStart: '.5em' }}\n onChange={(e) => onPositionChange(e.target.value as Side)}\n >\n <option value=\"left\">Left</option>\n <option value=\"right\">Right</option>\n <option value=\"top\">Top</option>\n <option value=\"bottom\">Bottom</option>\n </Select>\n ) : null}\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <Input\n placeholder=\"Filter\"\n aria-label=\"Filter by queryhash\"\n value={filter ?? ''}\n onChange={(e) => setFilter(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') setFilter('')\n }}\n style={{\n flex: '1',\n marginRight: '.5em',\n width: '100%',\n }}\n />\n <Select\n aria-label=\"Sort queries\"\n value={sort}\n onChange={(e) => setSort(e.target.value)}\n style={{\n flex: '1',\n minWidth: 75,\n marginRight: '.5em',\n }}\n >\n {Object.keys(sortFns).map((key) => (\n <option key={key} value={key}>\n Sort by {key}\n </option>\n ))}\n </Select>\n <Button\n type=\"button\"\n onClick={() => setBaseSort((old) => old * -1)}\n style={{\n padding: '.3em .4em',\n marginRight: '.5em',\n }}\n >\n {baseSort === 1 ? '⬆ Asc' : '⬇ Desc'}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n if (isMockOffline) {\n onlineManager.setOnline(undefined)\n setMockOffline(false)\n window.dispatchEvent(new Event('online'))\n } else {\n onlineManager.setOnline(false)\n setMockOffline(true)\n }\n }}\n aria-label={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n title={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n style={{\n padding: '0',\n height: '2em',\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"2em\"\n height=\"2em\"\n viewBox=\"0 0 24 24\"\n stroke={isMockOffline ? theme.danger : 'currentColor'}\n fill=\"none\"\n >\n {isMockOffline ? (\n <>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\" />\n <path d=\"M9.172 15.172a4 4 0 0 1 5.656 0\" />\n <path d=\"M6.343 12.343a7.963 7.963 0 0 1 3.864 -2.14m4.163 .155a7.965 7.965 0 0 1 3.287 2\" />\n <path d=\"M3.515 9.515a12 12 0 0 1 3.544 -2.455m3.101 -.92a12 12 0 0 1 10.325 3.374\" />\n <line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"21\" />\n </>\n ) : (\n <>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\" />\n <path d=\"M9.172 15.172a4 4 0 0 1 5.656 0\" />\n <path d=\"M6.343 12.343a8 8 0 0 1 11.314 0\" />\n <path d=\"M3.515 9.515c4.686 -4.687 12.284 -4.687 17 0\" />\n </>\n )}\n </svg>\n <ScreenReader\n text={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n />\n </Button>\n </div>\n </div>\n </div>\n <div\n style={{\n overflowY: 'auto',\n flex: '1',\n }}\n >\n {queries.map((query) => {\n return (\n <QueryRow\n queryKey={query.queryKey}\n activeQueryHash={activeQueryHash}\n setActiveQueryHash={setActiveQueryHash}\n key={query.queryHash}\n queryCache={queryCache}\n />\n )\n })}\n </div>\n </div>\n )}\n\n {activeQueryHash && isOpen ? (\n <ActiveQuery\n activeQueryHash={activeQueryHash}\n queryCache={queryCache}\n queryClient={queryClient}\n />\n ) : null}\n\n {showCloseButton ? (\n <Button\n type=\"button\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"true\"\n {...(otherCloseButtonProps as Record<string, unknown>)}\n style={{\n position: 'absolute',\n zIndex: 99999,\n margin: '.5em',\n bottom: 0,\n left: 0,\n ...otherCloseButtonProps.style,\n }}\n onClick={(e) => {\n setIsOpen(false)\n onCloseClick?.(e)\n }}\n >\n Close\n </Button>\n ) : null}\n </Panel>\n </ThemeProvider>\n )\n})\n\nconst ActiveQuery = ({\n queryCache,\n activeQueryHash,\n queryClient,\n}: {\n queryCache: QueryCache\n activeQueryHash: string\n queryClient: QueryClient\n}) => {\n const activeQuery = useSubscribeToQueryCache(queryCache, () =>\n queryCache.getAll().find((query) => query.queryHash === activeQueryHash),\n )\n\n const activeQueryState = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().find((query) => query.queryHash === activeQueryHash)\n ?.state,\n )\n\n const isStale =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache\n .getAll()\n .find((query) => query.queryHash === activeQueryHash)\n ?.isStale(),\n ) ?? false\n\n const observerCount =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache\n .getAll()\n .find((query) => query.queryHash === activeQueryHash)\n ?.getObserversCount(),\n ) ?? 0\n\n const handleRefetch = () => {\n const promise = activeQuery?.fetch()\n promise?.catch(noop)\n }\n\n if (!activeQuery || !activeQueryState) {\n return null\n }\n\n return (\n <ActiveQueryPanel>\n <div\n style={{\n padding: '.5em',\n background: theme.backgroundAlt,\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Query Details\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <div\n style={{\n marginBottom: '.5em',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n }}\n >\n <Code\n style={{\n lineHeight: '1.8em',\n }}\n >\n <pre\n style={{\n margin: 0,\n padding: 0,\n overflow: 'auto',\n }}\n >\n {displayValue(activeQuery.queryKey, true)}\n </pre>\n </Code>\n <span\n style={{\n padding: '0.3em .6em',\n borderRadius: '0.4em',\n fontWeight: 'bold',\n textShadow: '0 2px 10px black',\n background: getQueryStatusColor({\n queryState: activeQueryState,\n isStale: isStale,\n observerCount: observerCount,\n theme,\n }),\n flexShrink: 0,\n }}\n >\n {getQueryStatusLabel(activeQuery)}\n </span>\n </div>\n <div\n style={{\n marginBottom: '.5em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n Observers: <Code>{observerCount}</Code>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n Last Updated:{' '}\n <Code>\n {new Date(activeQueryState.dataUpdatedAt).toLocaleTimeString()}\n </Code>\n </div>\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Actions\n </div>\n <div\n style={{\n padding: '0.5em',\n }}\n >\n <Button\n type=\"button\"\n onClick={handleRefetch}\n disabled={activeQueryState.fetchStatus === 'fetching'}\n style={{\n background: theme.active,\n }}\n >\n Refetch\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.invalidateQueries(activeQuery)}\n style={{\n background: theme.warning,\n color: theme.inputTextColor,\n }}\n >\n Invalidate\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.resetQueries(activeQuery)}\n style={{\n background: theme.gray,\n }}\n >\n Reset\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.removeQueries(activeQuery)}\n style={{\n background: theme.danger,\n }}\n >\n Remove\n </Button>\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Data Explorer\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <Explorer\n label=\"Data\"\n value={activeQueryState.data}\n defaultExpanded={{}}\n copyable\n />\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Query Explorer\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <Explorer\n label=\"Query\"\n value={activeQuery}\n defaultExpanded={{\n queryKey: true,\n }}\n />\n </div>\n </ActiveQueryPanel>\n )\n}\n\nconst QueryStatusCount = ({ queryCache }: { queryCache: QueryCache }) => {\n const hasFresh = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'fresh')\n .length,\n )\n const hasFetching = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'fetching')\n .length,\n )\n const hasPaused = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'paused')\n .length,\n )\n const hasStale = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'stale')\n .length,\n )\n const hasInactive = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'inactive')\n .length,\n )\n return (\n <QueryKeys>\n <QueryKey\n style={{\n background: theme.success,\n opacity: hasFresh ? 1 : 0.3,\n }}\n >\n fresh <Code>({hasFresh})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.active,\n opacity: hasFetching ? 1 : 0.3,\n }}\n >\n fetching <Code>({hasFetching})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.paused,\n opacity: hasPaused ? 1 : 0.3,\n }}\n >\n paused <Code>({hasPaused})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.warning,\n color: 'black',\n textShadow: '0',\n opacity: hasStale ? 1 : 0.3,\n }}\n >\n stale <Code>({hasStale})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.gray,\n opacity: hasInactive ? 1 : 0.3,\n }}\n >\n inactive <Code>({hasInactive})</Code>\n </QueryKey>\n </QueryKeys>\n )\n}\n\ninterface QueryRowProps {\n queryKey: QueryKeyType\n setActiveQueryHash: (hash: string) => void\n activeQueryHash?: string\n queryCache: QueryCache\n}\n\nconst QueryRow = React.memo(\n ({\n queryKey,\n setActiveQueryHash,\n activeQueryHash,\n queryCache,\n }: QueryRowProps) => {\n const queryHash =\n useSubscribeToQueryCache(\n queryCache,\n () => queryCache.find(queryKey)?.queryHash,\n ) ?? ''\n\n const queryState = useSubscribeToQueryCache(\n queryCache,\n () => queryCache.find(queryKey)?.state,\n )\n\n const isStale =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.isStale(),\n ) ?? false\n\n const isDisabled =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.isDisabled(),\n ) ?? false\n\n const observerCount =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.getObserversCount(),\n ) ?? 0\n\n if (!queryState) {\n return null\n }\n\n return (\n <div\n role=\"button\"\n aria-label={`Open query details for ${queryHash}`}\n onClick={() =>\n setActiveQueryHash(activeQueryHash === queryHash ? '' : queryHash)\n }\n style={{\n display: 'flex',\n borderBottom: `solid 1px ${theme.grayAlt}`,\n cursor: 'pointer',\n background:\n queryHash === activeQueryHash ? 'rgba(255,255,255,.1)' : undefined,\n }}\n >\n <div\n style={{\n flex: '0 0 auto',\n width: '2em',\n height: '2em',\n background: getQueryStatusColor({\n queryState,\n isStale,\n observerCount,\n theme,\n }),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 'bold',\n textShadow: isStale ? '0' : '0 0 10px black',\n color: isStale ? 'black' : 'white',\n }}\n >\n {observerCount}\n </div>\n {isDisabled ? (\n <div\n style={{\n flex: '0 0 auto',\n height: '2em',\n background: theme.gray,\n display: 'flex',\n alignItems: 'center',\n fontWeight: 'bold',\n padding: '0 0.5em',\n }}\n >\n disabled\n </div>\n ) : null}\n <Code\n style={{\n padding: '.5em',\n }}\n >\n {`${queryHash}`}\n </Code>\n </div>\n )\n },\n)\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n"],"names":["ReactQueryDevtools","initialIsOpen","panelProps","closeButtonProps","toggleButtonProps","position","containerElement","Container","context","styleNonce","panelPosition","initialPanelPosition","rootRef","React","useRef","panelRef","isOpen","setIsOpen","useLocalStorage","devtoolsHeight","setDevtoolsHeight","defaultPanelSize","devtoolsWidth","setDevtoolsWidth","setPanelPosition","isResolvedOpen","setIsResolvedOpen","useState","isResizing","setIsResizing","isMounted","useIsMounted","handleDragStart","panelElement","startEvent","button","isVertical","isVerticalSide","height","width","getBoundingClientRect","startX","clientX","startY","clientY","newSize","run","moveEvent","preventDefault","minPanelSize","unsub","document","removeEventListener","addEventListener","useEffect","ref","current","handlePanelTransitionStart","style","visibility","handlePanelTransitionEnd","parentElement","styleProp","getSidedProp","previousPaddings","padding","paddingTop","paddingBottom","paddingLeft","paddingRight","window","Object","entries","forEach","property","previousValue","panelStyle","otherPanelProps","toggleButtonStyle","onClick","onToggleClick","otherToggleButtonProps","getSidePanelStyle","devtoolsTheme","theme","ThemeProvider","_extends","e","background","border","zIndex","display","fontSize","margin","cursor","top","right","left","bottom","Logo","ScreenReader","useSubscribeToQueryCache","queryCache","getSnapshot","skip","useSyncExternalStore","useCallback","onStoreChange","subscribe","notifyManager","batchCalls","ReactQueryDevtoolsPanel","forwardRef","props","onDragStart","onPositionChange","showCloseButton","onCloseClick","otherCloseButtonProps","queryClient","useQueryClient","getQueryCache","sort","setSort","keys","sortFns","filter","setFilter","baseSort","setBaseSort","sortFn","useMemo","queriesCount","getAll","length","activeQueryHash","setActiveQueryHash","queries","unsortedQueries","filtered","item","rankItem","queryHash","passed","sorted","a","b","isMockOffline","setMockOffline","Panel","__html","backgroundAlt","gray","getResizeHandleStyle","flex","minHeight","maxHeight","overflow","borderRight","grayAlt","flexDirection","justifyContent","alignItems","marginRight","marginBottom","Select","marginInlineStart","target","value","Input","key","minWidth","map","Button","old","onlineManager","setOnline","undefined","dispatchEvent","Event","danger","overflowY","query","queryKey","ActiveQuery","activeQuery","find","activeQueryState","state","isStale","observerCount","getObserversCount","handleRefetch","promise","fetch","catch","noop","ActiveQueryPanel","Code","lineHeight","displayValue","borderRadius","fontWeight","textShadow","getQueryStatusColor","queryState","flexShrink","getQueryStatusLabel","Date","dataUpdatedAt","toLocaleTimeString","fetchStatus","active","invalidateQueries","warning","color","inputTextColor","resetQueries","removeQueries","Explorer","data","QueryStatusCount","hasFresh","q","hasFetching","hasPaused","hasStale","hasInactive","QueryKeys","QueryKey","success","opacity","paused","QueryRow","memo","isDisabled","borderBottom"],"mappings":"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"}
1
+ {"version":3,"file":"devtools.js","sources":["../../src/devtools.tsx"],"sourcesContent":["'use client'\nimport * as React from 'react'\nimport { useSyncExternalStore } from './useSyncExternalStore'\nimport type {\n QueryCache,\n QueryClient,\n QueryKey as QueryKeyType,\n ContextOptions,\n Query,\n} from '@tanstack/react-query'\nimport {\n useQueryClient,\n onlineManager,\n notifyManager,\n} from '@tanstack/react-query'\nimport { rankItem } from '@tanstack/match-sorter-utils'\nimport useLocalStorage from './useLocalStorage'\nimport {\n isVerticalSide,\n sortFns,\n useIsMounted,\n getSidePanelStyle,\n minPanelSize,\n getResizeHandleStyle,\n getSidedProp,\n defaultPanelSize,\n displayValue,\n} from './utils'\nimport type { Corner, Side } from './utils'\nimport {\n Panel,\n QueryKeys,\n QueryKey,\n Button,\n Code,\n Input,\n Select,\n ActiveQueryPanel,\n} from './styledComponents'\nimport ScreenReader from './screenreader'\nimport { ThemeProvider, defaultTheme as theme } from './theme'\nimport { getQueryStatusLabel, getQueryStatusColor } from './utils'\nimport Explorer from './Explorer'\nimport Logo from './Logo'\nimport { useMemo } from 'react'\n\nexport interface DevToolsErrorType {\n /**\n * The name of the error.\n */\n name: string\n /**\n * How the error is initialized. Whatever it returns MUST implement toString() so\n * we can check against the current error.\n */\n initializer: (query: Query) => { toString(): string }\n}\n\nexport interface DevtoolsOptions extends ContextOptions {\n /**\n * Set this true if you want the dev tools to default to being open\n */\n initialIsOpen?: boolean\n /**\n * Use this to add props to the panel. For example, you can add className, style (merge and override default style), etc.\n */\n panelProps?: React.ComponentPropsWithoutRef<'div'>\n /**\n * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n closeButtonProps?: React.ComponentPropsWithoutRef<'button'>\n /**\n * Use this to add props to the toggle button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n toggleButtonProps?: React.ComponentPropsWithoutRef<'button'>\n /**\n * The position of the React Query logo to open and close the devtools panel.\n * Defaults to 'bottom-left'.\n */\n position?: Corner\n /**\n * The position of the React Query devtools panel.\n * Defaults to 'bottom'.\n */\n panelPosition?: Side\n /**\n * Use this to render the devtools inside a different type of container element for a11y purposes.\n * Any string which corresponds to a valid intrinsic JSX element is allowed.\n * Defaults to 'aside'.\n */\n containerElement?: string | any\n /**\n * nonce for style element for CSP\n */\n styleNonce?: string\n /**\n * Use this so you can define custom errors that can be shown in the devtools.\n */\n errorTypes?: DevToolsErrorType[]\n}\n\ninterface DevtoolsPanelOptions extends ContextOptions {\n /**\n * The standard React style object used to style a component with inline styles\n */\n style?: React.CSSProperties\n /**\n * The standard React className property used to style a component with classes\n */\n className?: string\n /**\n * A boolean variable indicating whether the panel is open or closed\n */\n isOpen?: boolean\n /**\n * nonce for style element for CSP\n */\n styleNonce?: string\n /**\n * A function that toggles the open and close state of the panel\n */\n setIsOpen: (isOpen: boolean) => void\n /**\n * Handles the opening and closing the devtools panel\n */\n onDragStart: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void\n /**\n * The position of the React Query devtools panel.\n * Defaults to 'bottom'.\n */\n position?: Side\n /**\n * Handles the panel position select change\n */\n onPositionChange?: (side: Side) => void\n /**\n * Show a close button inside the panel\n */\n showCloseButton?: boolean\n /**\n * Use this to add props to the close button. For example, you can add className, style (merge and override default style), onClick (extend default handler), etc.\n */\n closeButtonProps?: React.ComponentPropsWithoutRef<'button'>\n /**\n * Use this so you can define custom errors that can be shown in the devtools.\n */\n errorTypes?: DevToolsErrorType[]\n}\n\nexport function ReactQueryDevtools({\n initialIsOpen,\n panelProps = {},\n closeButtonProps = {},\n toggleButtonProps = {},\n position = 'bottom-left',\n containerElement: Container = 'aside',\n context,\n styleNonce,\n panelPosition: initialPanelPosition = 'bottom',\n errorTypes = [],\n}: DevtoolsOptions): React.ReactElement | null {\n const rootRef = React.useRef<HTMLDivElement>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const [isOpen, setIsOpen] = useLocalStorage(\n 'reactQueryDevtoolsOpen',\n initialIsOpen,\n )\n const [devtoolsHeight, setDevtoolsHeight] = useLocalStorage<number>(\n 'reactQueryDevtoolsHeight',\n defaultPanelSize,\n )\n const [devtoolsWidth, setDevtoolsWidth] = useLocalStorage<number>(\n 'reactQueryDevtoolsWidth',\n defaultPanelSize,\n )\n\n const [panelPosition = 'bottom', setPanelPosition] = useLocalStorage<Side>(\n 'reactQueryDevtoolsPanelPosition',\n initialPanelPosition,\n )\n\n const [isResolvedOpen, setIsResolvedOpen] = React.useState(false)\n const [isResizing, setIsResizing] = React.useState(false)\n const isMounted = useIsMounted()\n\n const handleDragStart = (\n panelElement: HTMLDivElement | null,\n startEvent: React.MouseEvent<HTMLDivElement, MouseEvent>,\n ) => {\n if (!panelElement) return\n if (startEvent.button !== 0) return // Only allow left click for drag\n const isVertical = isVerticalSide(panelPosition)\n setIsResizing(true)\n\n const { height, width } = panelElement.getBoundingClientRect()\n const startX = startEvent.clientX\n const startY = startEvent.clientY\n let newSize = 0\n\n const run = (moveEvent: MouseEvent) => {\n // prevent mouse selecting stuff with mouse drag\n moveEvent.preventDefault()\n\n // calculate the correct size based on mouse position and current panel position\n // hint: it is different formula for the opposite sides\n if (isVertical) {\n newSize =\n width +\n (panelPosition === 'right'\n ? startX - moveEvent.clientX\n : moveEvent.clientX - startX)\n setDevtoolsWidth(newSize)\n } else {\n newSize =\n height +\n (panelPosition === 'bottom'\n ? startY - moveEvent.clientY\n : moveEvent.clientY - startY)\n setDevtoolsHeight(newSize)\n }\n\n if (newSize < minPanelSize) {\n setIsOpen(false)\n } else {\n setIsOpen(true)\n }\n }\n\n const unsub = () => {\n if (isResizing) {\n setIsResizing(false)\n }\n\n document.removeEventListener('mousemove', run, false)\n document.removeEventListener('mouseUp', unsub, false)\n }\n\n document.addEventListener('mousemove', run, false)\n document.addEventListener('mouseup', unsub, false)\n }\n\n React.useEffect(() => {\n setIsResolvedOpen(isOpen ?? false)\n }, [isOpen, isResolvedOpen, setIsResolvedOpen])\n\n // Toggle panel visibility before/after transition (depending on direction).\n // Prevents focusing in a closed panel.\n React.useEffect(() => {\n const ref = panelRef.current\n if (ref) {\n const handlePanelTransitionStart = () => {\n if (isResolvedOpen) {\n ref.style.visibility = 'visible'\n }\n }\n\n const handlePanelTransitionEnd = () => {\n if (!isResolvedOpen) {\n ref.style.visibility = 'hidden'\n }\n }\n\n ref.addEventListener('transitionstart', handlePanelTransitionStart)\n ref.addEventListener('transitionend', handlePanelTransitionEnd)\n\n return () => {\n ref.removeEventListener('transitionstart', handlePanelTransitionStart)\n ref.removeEventListener('transitionend', handlePanelTransitionEnd)\n }\n }\n return\n }, [isResolvedOpen])\n\n React.useEffect(() => {\n if (isResolvedOpen && rootRef.current?.parentElement) {\n const { parentElement } = rootRef.current\n const styleProp = getSidedProp('padding', panelPosition)\n const isVertical = isVerticalSide(panelPosition)\n\n const previousPaddings = (({\n padding,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n }) => ({\n padding,\n paddingTop,\n paddingBottom,\n paddingLeft,\n paddingRight,\n }))(parentElement.style)\n\n const run = () => {\n // reset the padding\n parentElement.style.padding = '0px'\n parentElement.style.paddingTop = '0px'\n parentElement.style.paddingBottom = '0px'\n parentElement.style.paddingLeft = '0px'\n parentElement.style.paddingRight = '0px'\n // set the new padding based on the new panel position\n\n parentElement.style[styleProp] = `${\n isVertical ? devtoolsWidth : devtoolsHeight\n }px`\n }\n\n run()\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', run)\n\n return () => {\n window.removeEventListener('resize', run)\n Object.entries(previousPaddings).forEach(\n ([property, previousValue]) => {\n parentElement.style[property as keyof typeof previousPaddings] =\n previousValue\n },\n )\n }\n }\n }\n return\n }, [isResolvedOpen, panelPosition, devtoolsHeight, devtoolsWidth])\n\n const { style: panelStyle = {}, ...otherPanelProps } = panelProps\n\n const {\n style: toggleButtonStyle = {},\n onClick: onToggleClick,\n ...otherToggleButtonProps\n } = toggleButtonProps\n\n // get computed style based on panel position\n const style = getSidePanelStyle({\n position: panelPosition,\n devtoolsTheme: theme,\n isOpen: isResolvedOpen,\n height: devtoolsHeight,\n width: devtoolsWidth,\n isResizing,\n panelStyle,\n })\n\n // Do not render on the server\n if (!isMounted()) return null\n\n return (\n <Container\n ref={rootRef}\n className=\"ReactQueryDevtools\"\n aria-label=\"React Query Devtools\"\n >\n <ThemeProvider theme={theme}>\n <ReactQueryDevtoolsPanel\n ref={panelRef as any}\n context={context}\n styleNonce={styleNonce}\n position={panelPosition}\n onPositionChange={setPanelPosition}\n showCloseButton\n closeButtonProps={closeButtonProps}\n {...otherPanelProps}\n style={style}\n isOpen={isResolvedOpen}\n setIsOpen={setIsOpen}\n onDragStart={(e) => handleDragStart(panelRef.current, e)}\n errorTypes={errorTypes}\n />\n </ThemeProvider>\n {!isResolvedOpen ? (\n <button\n type=\"button\"\n {...otherToggleButtonProps}\n aria-label=\"Open React Query Devtools\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"false\"\n onClick={(e) => {\n setIsOpen(true)\n onToggleClick?.(e)\n }}\n style={{\n background: 'none',\n border: 0,\n padding: 0,\n position: 'fixed',\n zIndex: 99999,\n display: 'inline-flex',\n fontSize: '1.5em',\n margin: '.5em',\n cursor: 'pointer',\n width: 'fit-content',\n ...(position === 'top-right'\n ? {\n top: '0',\n right: '0',\n }\n : position === 'top-left'\n ? {\n top: '0',\n left: '0',\n }\n : position === 'bottom-right'\n ? {\n bottom: '0',\n right: '0',\n }\n : {\n bottom: '0',\n left: '0',\n }),\n ...toggleButtonStyle,\n }}\n >\n <Logo aria-hidden />\n <ScreenReader text=\"Open React Query Devtools\" />\n </button>\n ) : null}\n </Container>\n )\n}\n\nconst useSubscribeToQueryCache = <T,>(\n queryCache: QueryCache,\n getSnapshot: () => T,\n skip: boolean = false,\n): T => {\n return useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n if (!skip)\n return queryCache.subscribe(notifyManager.batchCalls(onStoreChange))\n return () => {\n return\n }\n },\n [queryCache, skip],\n ),\n getSnapshot,\n getSnapshot,\n )\n}\n\nexport const ReactQueryDevtoolsPanel = React.forwardRef<\n HTMLDivElement,\n DevtoolsPanelOptions\n>(function ReactQueryDevtoolsPanel(props, ref): React.ReactElement {\n const {\n isOpen = true,\n styleNonce,\n setIsOpen,\n context,\n onDragStart,\n onPositionChange,\n showCloseButton,\n position,\n closeButtonProps = {},\n errorTypes = [],\n ...panelProps\n } = props\n\n const { onClick: onCloseClick, ...otherCloseButtonProps } = closeButtonProps\n\n const queryClient = useQueryClient({ context })\n const queryCache = queryClient.getQueryCache()\n\n const [sort, setSort] = useLocalStorage(\n 'reactQueryDevtoolsSortFn',\n Object.keys(sortFns)[0],\n )\n\n const [filter, setFilter] = useLocalStorage('reactQueryDevtoolsFilter', '')\n\n const [baseSort, setBaseSort] = useLocalStorage(\n 'reactQueryDevtoolsBaseSort',\n 1,\n )\n\n const sortFn = React.useMemo(() => sortFns[sort as string], [sort])\n\n const queriesCount = useSubscribeToQueryCache(\n queryCache,\n () => queryCache.getAll().length,\n !isOpen,\n )\n\n const [activeQueryHash, setActiveQueryHash] = useLocalStorage(\n 'reactQueryDevtoolsActiveQueryHash',\n '',\n )\n\n const queries = React.useMemo(() => {\n const unsortedQueries = queryCache.getAll()\n\n if (queriesCount === 0) {\n return []\n }\n\n const filtered = filter\n ? unsortedQueries.filter(\n (item) => rankItem(item.queryHash, filter).passed,\n )\n : [...unsortedQueries]\n\n const sorted = sortFn\n ? filtered.sort((a, b) => sortFn(a, b) * (baseSort as number))\n : filtered\n\n return sorted\n }, [baseSort, sortFn, filter, queriesCount, queryCache])\n\n const [isMockOffline, setMockOffline] = React.useState(false)\n\n return (\n <ThemeProvider theme={theme}>\n <Panel\n ref={ref}\n className=\"ReactQueryDevtoolsPanel\"\n aria-label=\"React Query Devtools Panel\"\n id=\"ReactQueryDevtoolsPanel\"\n {...panelProps}\n style={{\n height: defaultPanelSize,\n position: 'relative',\n ...panelProps.style,\n }}\n >\n <style\n nonce={styleNonce}\n dangerouslySetInnerHTML={{\n __html: `\n .ReactQueryDevtoolsPanel * {\n scrollbar-color: ${theme.backgroundAlt} ${theme.gray};\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar, .ReactQueryDevtoolsPanel scrollbar {\n width: 1em;\n height: 1em;\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar-track, .ReactQueryDevtoolsPanel scrollbar-track {\n background: ${theme.backgroundAlt};\n }\n\n .ReactQueryDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactQueryDevtoolsPanel scrollbar-thumb {\n background: ${theme.gray};\n border-radius: .5em;\n border: 3px solid ${theme.backgroundAlt};\n }\n `,\n }}\n />\n <div\n style={getResizeHandleStyle(position)}\n onMouseDown={onDragStart}\n ></div>\n\n {isOpen && (\n <div\n style={{\n flex: '1 1 500px',\n minHeight: '40%',\n maxHeight: '100%',\n overflow: 'auto',\n borderRight: `1px solid ${theme.grayAlt}`,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n padding: '.5em',\n background: theme.backgroundAlt,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close React Query Devtools\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"true\"\n onClick={() => setIsOpen(false)}\n style={{\n display: 'inline-flex',\n background: 'none',\n border: 0,\n padding: 0,\n marginRight: '.5em',\n cursor: 'pointer',\n }}\n >\n <Logo aria-hidden />\n <ScreenReader text=\"Close React Query Devtools\" />\n </button>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: '.5em',\n }}\n >\n <QueryStatusCount queryCache={queryCache} />\n {position && onPositionChange ? (\n <Select\n aria-label=\"Panel position\"\n value={position}\n style={{ marginInlineStart: '.5em' }}\n onChange={(e) => onPositionChange(e.target.value as Side)}\n >\n <option value=\"left\">Left</option>\n <option value=\"right\">Right</option>\n <option value=\"top\">Top</option>\n <option value=\"bottom\">Bottom</option>\n </Select>\n ) : null}\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: '0.5em',\n }}\n >\n <Input\n placeholder=\"Filter\"\n aria-label=\"Filter by queryhash\"\n value={filter ?? ''}\n onChange={(e) => setFilter(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') setFilter('')\n }}\n style={{\n flex: '1',\n width: '100%',\n }}\n />\n <Select\n aria-label=\"Sort queries\"\n value={sort}\n onChange={(e) => setSort(e.target.value)}\n style={{\n flex: '1',\n minWidth: 75,\n marginRight: '.5em',\n }}\n >\n {Object.keys(sortFns).map((key) => (\n <option key={key} value={key}>\n Sort by {key}\n </option>\n ))}\n </Select>\n <Button\n type=\"button\"\n onClick={() => setBaseSort((old) => old * -1)}\n style={{\n padding: '.3em .4em',\n marginRight: '.5em',\n }}\n >\n {baseSort === 1 ? '⬆ Asc' : '⬇ Desc'}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n if (isMockOffline) {\n onlineManager.setOnline(undefined)\n setMockOffline(false)\n window.dispatchEvent(new Event('online'))\n } else {\n onlineManager.setOnline(false)\n setMockOffline(true)\n }\n }}\n aria-label={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n title={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n style={{\n padding: '0',\n height: '2em',\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"2em\"\n height=\"2em\"\n viewBox=\"0 0 24 24\"\n stroke={isMockOffline ? theme.danger : 'currentColor'}\n fill=\"none\"\n >\n {isMockOffline ? (\n <>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\" />\n <path d=\"M9.172 15.172a4 4 0 0 1 5.656 0\" />\n <path d=\"M6.343 12.343a7.963 7.963 0 0 1 3.864 -2.14m4.163 .155a7.965 7.965 0 0 1 3.287 2\" />\n <path d=\"M3.515 9.515a12 12 0 0 1 3.544 -2.455m3.101 -.92a12 12 0 0 1 10.325 3.374\" />\n <line x1=\"3\" y1=\"3\" x2=\"21\" y2=\"21\" />\n </>\n ) : (\n <>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\" />\n <path d=\"M9.172 15.172a4 4 0 0 1 5.656 0\" />\n <path d=\"M6.343 12.343a8 8 0 0 1 11.314 0\" />\n <path d=\"M3.515 9.515c4.686 -4.687 12.284 -4.687 17 0\" />\n </>\n )}\n </svg>\n <ScreenReader\n text={\n isMockOffline\n ? 'Restore offline mock'\n : 'Mock offline behavior'\n }\n />\n </Button>\n </div>\n </div>\n </div>\n <div\n style={{\n overflowY: 'auto',\n flex: '1',\n }}\n >\n {queries.map((query) => {\n return (\n <QueryRow\n queryKey={query.queryKey}\n activeQueryHash={activeQueryHash}\n setActiveQueryHash={setActiveQueryHash}\n key={query.queryHash}\n queryCache={queryCache}\n />\n )\n })}\n </div>\n </div>\n )}\n\n {activeQueryHash && isOpen ? (\n <ActiveQuery\n activeQueryHash={activeQueryHash}\n queryCache={queryCache}\n queryClient={queryClient}\n errorTypes={errorTypes}\n />\n ) : null}\n\n {showCloseButton ? (\n <Button\n type=\"button\"\n aria-controls=\"ReactQueryDevtoolsPanel\"\n aria-haspopup=\"true\"\n aria-expanded=\"true\"\n {...(otherCloseButtonProps as Record<string, unknown>)}\n style={{\n position: 'absolute',\n zIndex: 99999,\n margin: '.5em',\n bottom: 0,\n left: 0,\n ...otherCloseButtonProps.style,\n }}\n onClick={(e) => {\n setIsOpen(false)\n onCloseClick?.(e)\n }}\n >\n Close\n </Button>\n ) : null}\n </Panel>\n </ThemeProvider>\n )\n})\n\nconst ActiveQuery = ({\n queryCache,\n activeQueryHash,\n queryClient,\n errorTypes,\n}: {\n queryCache: QueryCache\n activeQueryHash: string\n queryClient: QueryClient\n errorTypes: DevToolsErrorType[]\n}) => {\n const activeQuery = useSubscribeToQueryCache(queryCache, () =>\n queryCache.getAll().find((query) => query.queryHash === activeQueryHash),\n )\n\n const activeQueryState = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().find((query) => query.queryHash === activeQueryHash)\n ?.state,\n )\n\n const isStale =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache\n .getAll()\n .find((query) => query.queryHash === activeQueryHash)\n ?.isStale(),\n ) ?? false\n\n const observerCount =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache\n .getAll()\n .find((query) => query.queryHash === activeQueryHash)\n ?.getObserversCount(),\n ) ?? 0\n\n const handleRefetch = () => {\n const promise = activeQuery?.fetch()\n promise?.catch(noop)\n }\n\n const currentErrorTypeName = useMemo(() => {\n if (activeQuery && activeQueryState?.error) {\n const errorType = errorTypes.find(\n (type) =>\n type.initializer(activeQuery).toString() ===\n activeQueryState.error?.toString(),\n )\n return errorType?.name\n }\n return undefined\n }, [activeQuery, activeQueryState?.error, errorTypes])\n\n if (!activeQuery || !activeQueryState) {\n return null\n }\n\n const triggerError = (errorType?: DevToolsErrorType) => {\n const error =\n errorType?.initializer(activeQuery) ??\n new Error('Unknown error from devtools')\n\n const __previousQueryOptions = activeQuery.options\n\n activeQuery.setState({\n status: 'error',\n error,\n fetchMeta: {\n ...activeQuery.state.fetchMeta,\n __previousQueryOptions,\n },\n })\n }\n\n const restoreQueryAfterLoadingOrError = () => {\n activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {\n // Make sure this fetch will cancel the previous one\n cancelRefetch: true,\n })\n }\n\n return (\n <ActiveQueryPanel>\n <div\n style={{\n padding: '.5em',\n background: theme.backgroundAlt,\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Query Details\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <div\n style={{\n marginBottom: '.5em',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n }}\n >\n <Code\n style={{\n lineHeight: '1.8em',\n }}\n >\n <pre\n style={{\n margin: 0,\n padding: 0,\n overflow: 'auto',\n }}\n >\n {displayValue(activeQuery.queryKey, true)}\n </pre>\n </Code>\n <span\n style={{\n padding: '0.3em .6em',\n borderRadius: '0.4em',\n fontWeight: 'bold',\n textShadow: '0 2px 10px black',\n background: getQueryStatusColor({\n queryState: activeQueryState,\n isStale: isStale,\n observerCount: observerCount,\n theme,\n }),\n flexShrink: 0,\n }}\n >\n {getQueryStatusLabel(activeQuery)}\n </span>\n </div>\n <div\n style={{\n marginBottom: '.5em',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n Observers: <Code>{observerCount}</Code>\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n Last Updated:{' '}\n <Code>\n {new Date(activeQueryState.dataUpdatedAt).toLocaleTimeString()}\n </Code>\n </div>\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Actions\n </div>\n <div\n style={{\n padding: '0.5em',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '0.5em',\n alignItems: 'flex-end',\n }}\n >\n <Button\n type=\"button\"\n onClick={handleRefetch}\n disabled={activeQueryState.fetchStatus === 'fetching'}\n style={{\n background: theme.active,\n }}\n >\n Refetch\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.invalidateQueries(activeQuery)}\n style={{\n background: theme.warning,\n color: theme.inputTextColor,\n }}\n >\n Invalidate\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.resetQueries(activeQuery)}\n style={{\n background: theme.gray,\n }}\n >\n Reset\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => queryClient.removeQueries(activeQuery)}\n style={{\n background: theme.danger,\n }}\n >\n Remove\n </Button>{' '}\n <Button\n type=\"button\"\n onClick={() => {\n if (activeQuery.state.data === undefined) {\n restoreQueryAfterLoadingOrError()\n } else {\n const __previousQueryOptions = activeQuery.options\n // Trigger a fetch in order to trigger suspense as well.\n activeQuery.fetch({\n ...__previousQueryOptions,\n queryFn: () => {\n return new Promise(() => {\n // Never resolve\n })\n },\n cacheTime: -1,\n })\n activeQuery.setState({\n data: undefined,\n status: 'loading',\n fetchMeta: {\n ...activeQuery.state.fetchMeta,\n __previousQueryOptions,\n },\n })\n }\n }}\n style={{\n background: theme.paused,\n }}\n >\n {activeQuery.state.status === 'loading' ? 'Restore' : 'Trigger'}{' '}\n loading\n </Button>{' '}\n {errorTypes.length === 0 || activeQuery.state.status === 'error' ? (\n <Button\n type=\"button\"\n onClick={() => {\n if (!activeQuery.state.error) {\n triggerError()\n } else {\n queryClient.resetQueries(activeQuery)\n }\n }}\n style={{\n background: theme.danger,\n }}\n >\n {activeQuery.state.status === 'error' ? 'Restore' : 'Trigger'} error\n </Button>\n ) : (\n <label>\n Trigger error:\n <Select\n value={currentErrorTypeName ?? ''}\n style={{ marginInlineStart: '.5em' }}\n onChange={(e) => {\n const errorType = errorTypes.find(\n (t) => t.name === e.target.value,\n )\n\n triggerError(errorType)\n }}\n >\n <option key=\"\" value=\"\" />\n {errorTypes.map((errorType) => (\n <option key={errorType.name} value={errorType.name}>\n {errorType.name}\n </option>\n ))}\n </Select>\n </label>\n )}\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Data Explorer\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <Explorer\n label=\"Data\"\n value={activeQueryState.data}\n defaultExpanded={{}}\n copyable\n />\n </div>\n <div\n style={{\n background: theme.backgroundAlt,\n padding: '.5em',\n position: 'sticky',\n top: 0,\n zIndex: 1,\n }}\n >\n Query Explorer\n </div>\n <div\n style={{\n padding: '.5em',\n }}\n >\n <Explorer\n label=\"Query\"\n value={activeQuery}\n defaultExpanded={{\n queryKey: true,\n }}\n />\n </div>\n </ActiveQueryPanel>\n )\n}\n\nconst QueryStatusCount = ({ queryCache }: { queryCache: QueryCache }) => {\n const hasFresh = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'fresh')\n .length,\n )\n const hasFetching = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'fetching')\n .length,\n )\n const hasPaused = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'paused')\n .length,\n )\n const hasStale = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'stale')\n .length,\n )\n const hasInactive = useSubscribeToQueryCache(\n queryCache,\n () =>\n queryCache.getAll().filter((q) => getQueryStatusLabel(q) === 'inactive')\n .length,\n )\n return (\n <QueryKeys>\n <QueryKey\n style={{\n background: theme.success,\n opacity: hasFresh ? 1 : 0.3,\n }}\n >\n fresh <Code>({hasFresh})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.active,\n opacity: hasFetching ? 1 : 0.3,\n }}\n >\n fetching <Code>({hasFetching})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.paused,\n opacity: hasPaused ? 1 : 0.3,\n }}\n >\n paused <Code>({hasPaused})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.warning,\n color: 'black',\n textShadow: '0',\n opacity: hasStale ? 1 : 0.3,\n }}\n >\n stale <Code>({hasStale})</Code>\n </QueryKey>{' '}\n <QueryKey\n style={{\n background: theme.gray,\n opacity: hasInactive ? 1 : 0.3,\n }}\n >\n inactive <Code>({hasInactive})</Code>\n </QueryKey>\n </QueryKeys>\n )\n}\n\ninterface QueryRowProps {\n queryKey: QueryKeyType\n setActiveQueryHash: (hash: string) => void\n activeQueryHash?: string\n queryCache: QueryCache\n}\n\nconst QueryRow = React.memo(\n ({\n queryKey,\n setActiveQueryHash,\n activeQueryHash,\n queryCache,\n }: QueryRowProps) => {\n const queryHash =\n useSubscribeToQueryCache(\n queryCache,\n () => queryCache.find(queryKey)?.queryHash,\n ) ?? ''\n\n const queryState = useSubscribeToQueryCache(\n queryCache,\n () => queryCache.find(queryKey)?.state,\n )\n\n const isStale =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.isStale(),\n ) ?? false\n\n const isDisabled =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.isDisabled(),\n ) ?? false\n\n const observerCount =\n useSubscribeToQueryCache(queryCache, () =>\n queryCache.find(queryKey)?.getObserversCount(),\n ) ?? 0\n\n if (!queryState) {\n return null\n }\n\n return (\n <div\n role=\"button\"\n aria-label={`Open query details for ${queryHash}`}\n onClick={() =>\n setActiveQueryHash(activeQueryHash === queryHash ? '' : queryHash)\n }\n style={{\n display: 'flex',\n borderBottom: `solid 1px ${theme.grayAlt}`,\n cursor: 'pointer',\n background:\n queryHash === activeQueryHash ? 'rgba(255,255,255,.1)' : undefined,\n }}\n >\n <div\n style={{\n flex: '0 0 auto',\n width: '2em',\n height: '2em',\n background: getQueryStatusColor({\n queryState,\n isStale,\n observerCount,\n theme,\n }),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 'bold',\n textShadow: isStale ? '0' : '0 0 10px black',\n color: isStale ? 'black' : 'white',\n }}\n >\n {observerCount}\n </div>\n {isDisabled ? (\n <div\n style={{\n flex: '0 0 auto',\n height: '2em',\n background: theme.gray,\n display: 'flex',\n alignItems: 'center',\n fontWeight: 'bold',\n padding: '0 0.5em',\n }}\n >\n disabled\n </div>\n ) : null}\n <Code\n style={{\n padding: '.5em',\n }}\n >\n {`${queryHash}`}\n </Code>\n </div>\n )\n },\n)\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction noop() {}\n"],"names":["panelProps","closeButtonProps","toggleButtonProps","position","errorTypes","width","newSize","document","setIsResolvedOpen","ref","parentElement","paddingRight","window","Object","onClick","devtoolsTheme","isOpen","height","panelStyle","onToggleClick","background","border","padding","zIndex","display","fontSize","margin","cursor","top","right","left","bottom","ReactQueryDevtoolsPanel","context","__html","flex","minHeight","maxHeight","overflow","flexDirection","justifyContent","alignItems","marginRight","marginBottom","marginInlineStart","flexWrap","gap","minWidth","overflowY","onCloseClick","promise","status","fetchMeta","__previousQueryOptions","cancelRefetch","lineHeight","borderRadius","fontWeight","textShadow","queryState","isStale","observerCount","theme","flexShrink","activeQuery","queryFn","cacheTime","data","queryKey","queryCache","opacity","color"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqJO;;AAELA;AACAC;AACAC;AACAC;;;;;AAKAC;AAViC;AAYjC;AACA;;;;AAcA;;;;;AASA;;AAKE;;AACA;;;;AAGgBC;;AAChB;AACA;;;;AAIE;;AAIA;;AACA;AACEC;;AAMD;AACCA;;AAMD;;;;AAIA;;AAEA;;;;AAID;;AAEC;;AAEDC;AACAA;;;AAGFA;AACAA;;;;AAIAC;;AAIF;;;AAEE;;AACA;;AAEI;AACEC;AACD;;;;;AAKCA;AACD;;;AAGHA;AACAA;AAEA;AACEA;AACAA;;AAEH;;AACD;;;AAGoB;;;;AAEVC;;AACR;AACA;;;;;;;AAOEC;AALyB;;;;;AAWzBA;AALK;;;AASL;AACAD;AACAA;AACAA;AACAA;AACAA;;;;;;;AAUF;AACEE;AAEA;AACEA;AACAC;AAEIH;;;AAKP;AACF;;AACD;;;;;AAGI;;;AAIJI;;;;;AAMAX;AACAY;AACAC;AACAC;AACAZ;;AAEAa;;;AAIF;AAEA;AAEI;AACA;;AAFF;AAKiB;AAAf;AAEI;AACA;AACA;AACA;AACA;AACA;AACA;AAPF;AASE;AACA;AACA;;AAEA;AAbF;AAkBE;AADF;AAGE;AACA;AACA;AACA;;;AAGEC;;AAEF;AACEC;AACAC;AACAC;AACAnB;AACAoB;AACAC;AACAC;AACAC;AACAC;AACAtB;;AAGMuB;AACAC;AAFF;AAMED;AACAE;AAFF;AAMEC;AACAF;AAFF;AAKEE;AACAD;AAFF;;AA1BC;AAXT;AA4CQ;;AACQ;;AAKvB;;AAED;AAKE;AAGM;AAEA;AACE;;;AAQT;;AAEYE;;AAKThB;;;;;;;;AAQAf;AACAG;;AAVI;;AAcEU;;AAAF;;AAE+BmB;AAAF;AACnC;AAEA;;;AAYA;AAEA;;AAWA;AACE;;;AAGE;AACD;;;;AAYD;AACD;;AAID;AACiB;AAAf;AAEI;AACA;AACA;AACA;AAJF;AAME;AACEhB;AACAd;AACA;AAHK;;AAOL;AACA;AACE+B;AADuB;AAF3B;AA0BE;AACA;;AAKE;AACEC;AACAC;AACAC;AACAC;;AAEAd;AACAe;AAPK;;AAWL;AACEjB;;AAEAE;AACAgB;AACAC;AALK;;AASL;AACA;AACA;AACA;AACA;AACA;AACA;AACEjB;AACAJ;AACAC;AACAC;AACAoB;AACAf;AANK;AAPT;AAgBQ;;AACQ;AAAd;AAGA;AACEH;AACAe;AAFK;;AAML;AACEf;AACAgB;AACAC;AACAE;AAJK;AADT;AAQoB;AAAlB;AAGI;AACA;AACA;AAASC;;;;AAGD;AAAR;AACQ;AAAR;AACQ;AAAR;AACQ;AAAR;AAKJ;AACEpB;AACAiB;AACAI;AACAC;AAJK;AADT;AASI;AACA;AACA;;;;;AAKA;AACEX;AACA9B;AAFK;;AAMP;AACA;;AAEA;AACE8B;AACAY;AACAL;AAHK;;AAOG;AAAU;AAAlB;AAMF;;AAEA;AACEpB;AACAoB;AAFK;;AAQP;AACA;AACE;;;AAGE9B;AACD;;;AAGA;;AAEH;AAKA;AAKA;AACEU;AACAL;AAFK;;AAML;AACA;AACA;AACA;AACA;AACA;;AAIU;AAAc;AAAkB;AAAtC;AACM;AAAQ;AAAQ;AAAW;AAAjC;AACM;AAAN;AACM;AAAN;AACM;AAAN;AACM;AAAO;AAAO;AAAQ;;AAItB;AAAc;AAAkB;AAAtC;AACM;AAAQ;AAAQ;AAAW;AAAjC;AACM;AAAN;AACM;AAAN;AACM;AAAN;AAKJ;AADF;AAYN;AACE+B;AACAb;AAFK;AADT;AAOI;;AAGI;AACA;;AAEA;;;AAUR;AACA;AACA;AACA;AAJF;AAUE;AACA;AACA;;AAHF;AAME;AACEhC;AACAoB;AACAG;AACAK;AACAD;AACA;;;;AAIAmB;AACD;;AAQZ;;AAED;;;;AAIE7C;AAJmB;AAUf;;;AAKJ;AAEE;;AAAA;AAAA;AAKF;AACuC;;AAAA;;AAOvC;AACuC;;AAAA;;;;AAQrC;AACA8C;;;AAGF;AACE;AACE;AACE;;AAAA;AAAA;AAIF;AACD;;AACD;AACD;;AAED;AACE;AACD;;;AAEuD;;AACtD;AAIA;;AAGEC;;AAEAC;AAEEC;AAFS;;;;;;AASX;AACAC;;;;;AAOE;AACEhC;;AAEAnB;AACAyB;AACAL;AALK;AADT;AAYE;AACED;AADK;;AAKL;AACEqB;AACAnB;AACAiB;AACAD;AAJK;AADT;AASI;AACEe;AADK;;AAKL;AACE7B;AACAJ;AACAgB;AAHK;;AAUT;AACEhB;AACAkC;AACAC;AACAC;;AAEEC;AACAC;AACAC;AACAC;AAJ8B;AAMhCC;AAXK;AADT;AAmBA;AACEpB;AACAnB;AACAiB;AACAD;AAJK;AADT;AAWE;AACEhB;AACAiB;AACAD;AAHK;AADT;AAcA;;AAEElB;AACAnB;AACAyB;AACAL;AALK;AADT;AAYE;AACED;AACAE;AACAqB;AACAC;AACAL;AALK;AADT;AAUI;AACA;AACA;AACA;;AAAO;AAJT;AAWE;AACA;AACA;;;AAAO;AAHT;AAWE;AACA;AACA;;AAAO;AAHT;AAUE;AACA;AACA;;AAAO;AAHT;AAUE;AACA;AACE;;AAEC;AACC;;AAEAuB;AAEEC;AACE;AAEC;;AAEHC;;;AAGAC;AACAhB;AACAC;AAEEC;AAFS;;AAKd;;AAEH;;AAAO;AA3BT;AAoCI;AACA;AACE;;AAEC;;AAEA;;AAEH;;AAAO;AATT;AAmBI;AACA;AAAST;;;AAEP;;AAKD;;AAEO;AAAO;AAAf;;;;AAWN;;AAEEtB;AACAnB;AACAyB;AACAL;AALK;AADT;AAYE;AACED;AADK;AADT;AAMI;;AAEA;;AAHF;AAQA;;AAEEA;AACAnB;AACAyB;AACAL;AALK;AADT;AAYE;AACED;AADK;AADT;AAMI;AACA;AACA;AACE8C;AADe;AAHnB;AAUP;;AAED;AAA4BC;AAAF;;;;;;AA+BxB;AAGM;;AAEEC;AAFK;;AAQP;;AAEEA;AAFK;;AAQP;;AAEEA;AAFK;;AAQP;;AAEEC;AACAb;AACAY;AAJK;;AAUP;;AAEEA;AAFK;AADT;AAUL;;AASD;;;;AAKID;AAJD;AAKoB;;AACnB;AAGI;;;;AAGJ;AAEE;;;AAAA;AAGF;AACuC;;;;AAIvC;AACuC;;;;AAIvC;AACuC;;;;;;AAKrC;AACD;;;AAIG;AACA;;AAIA;AACE7C;;AAEAG;AACAP;AAJK;;AASL;AACEe;AACA9B;AACAY;;;;;AAKE6C;AAJ8B;AAMhCtC;AACAiB;AACAD;AACAiB;AACAC;AACAa;AAfK;AADT;AAuBI;AACEpC;AACAlB;;AAEAO;AACAiB;AACAgB;AACAnC;AAPK;AADT;AAeA;AACEA;AADK;;AAQd;;AAIH;;;"}
@@ -1,5 +1,7 @@
1
+ 'use client';
1
2
  import { extends as _extends } from './_virtual/_rollupPluginBabelHelpers.mjs';
2
3
  import * as React from 'react';
4
+ import { useMemo } from 'react';
3
5
  import { useQueryClient, onlineManager, notifyManager } from '@tanstack/react-query';
4
6
  import { rankItem } from '@tanstack/match-sorter-utils';
5
7
  import useLocalStorage from './useLocalStorage.mjs';
@@ -20,7 +22,8 @@ function ReactQueryDevtools({
20
22
  containerElement: Container = 'aside',
21
23
  context,
22
24
  styleNonce,
23
- panelPosition: initialPanelPosition = 'bottom'
25
+ panelPosition: initialPanelPosition = 'bottom',
26
+ errorTypes = []
24
27
  }) {
25
28
  const rootRef = React.useRef(null);
26
29
  const panelRef = React.useRef(null);
@@ -199,7 +202,8 @@ function ReactQueryDevtools({
199
202
  style: style,
200
203
  isOpen: isResolvedOpen,
201
204
  setIsOpen: setIsOpen,
202
- onDragStart: e => handleDragStart(panelRef.current, e)
205
+ onDragStart: e => handleDragStart(panelRef.current, e),
206
+ errorTypes: errorTypes
203
207
  }))), !isResolvedOpen ? /*#__PURE__*/React.createElement("button", _extends({
204
208
  type: "button"
205
209
  }, otherToggleButtonProps, {
@@ -264,6 +268,7 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
264
268
  showCloseButton,
265
269
  position,
266
270
  closeButtonProps = {},
271
+ errorTypes = [],
267
272
  ...panelProps
268
273
  } = props;
269
274
  const {
@@ -382,7 +387,9 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
382
387
  }, "Bottom")) : null), /*#__PURE__*/React.createElement("div", {
383
388
  style: {
384
389
  display: 'flex',
385
- alignItems: 'center'
390
+ alignItems: 'center',
391
+ flexWrap: 'wrap',
392
+ gap: '0.5em'
386
393
  }
387
394
  }, /*#__PURE__*/React.createElement(Input, {
388
395
  placeholder: "Filter",
@@ -394,7 +401,6 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
394
401
  },
395
402
  style: {
396
403
  flex: '1',
397
- marginRight: '.5em',
398
404
  width: '100%'
399
405
  }
400
406
  }), /*#__PURE__*/React.createElement(Select, {
@@ -494,7 +500,8 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
494
500
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
495
501
  activeQueryHash: activeQueryHash,
496
502
  queryCache: queryCache,
497
- queryClient: queryClient
503
+ queryClient: queryClient,
504
+ errorTypes: errorTypes
498
505
  }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
499
506
  type: "button",
500
507
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -519,7 +526,8 @@ const ReactQueryDevtoolsPanel = /*#__PURE__*/React.forwardRef(function ReactQuer
519
526
  const ActiveQuery = ({
520
527
  queryCache,
521
528
  activeQueryHash,
522
- queryClient
529
+ queryClient,
530
+ errorTypes
523
531
  }) => {
524
532
  var _useSubscribeToQueryC, _useSubscribeToQueryC2;
525
533
 
@@ -545,10 +553,44 @@ const ActiveQuery = ({
545
553
  promise == null ? void 0 : promise.catch(noop);
546
554
  };
547
555
 
556
+ const currentErrorTypeName = useMemo(() => {
557
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
558
+ const errorType = errorTypes.find(type => {
559
+ var _activeQueryState$err;
560
+
561
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
562
+ });
563
+ return errorType == null ? void 0 : errorType.name;
564
+ }
565
+
566
+ return undefined;
567
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
568
+
548
569
  if (!activeQuery || !activeQueryState) {
549
570
  return null;
550
571
  }
551
572
 
573
+ const triggerError = errorType => {
574
+ var _errorType$initialize;
575
+
576
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
577
+ const __previousQueryOptions = activeQuery.options;
578
+ activeQuery.setState({
579
+ status: 'error',
580
+ error,
581
+ fetchMeta: { ...activeQuery.state.fetchMeta,
582
+ __previousQueryOptions
583
+ }
584
+ });
585
+ };
586
+
587
+ const restoreQueryAfterLoadingOrError = () => {
588
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
589
+ // Make sure this fetch will cancel the previous one
590
+ cancelRefetch: true
591
+ });
592
+ };
593
+
552
594
  return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
553
595
  style: {
554
596
  padding: '.5em',
@@ -615,7 +657,11 @@ const ActiveQuery = ({
615
657
  }
616
658
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
617
659
  style: {
618
- padding: '0.5em'
660
+ padding: '0.5em',
661
+ display: 'flex',
662
+ flexWrap: 'wrap',
663
+ gap: '0.5em',
664
+ alignItems: 'flex-end'
619
665
  }
620
666
  }, /*#__PURE__*/React.createElement(Button, {
621
667
  type: "button",
@@ -643,7 +689,61 @@ const ActiveQuery = ({
643
689
  style: {
644
690
  background: defaultTheme.danger
645
691
  }
646
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
692
+ }, "Remove"), ' ', /*#__PURE__*/React.createElement(Button, {
693
+ type: "button",
694
+ onClick: () => {
695
+ if (activeQuery.state.data === undefined) {
696
+ restoreQueryAfterLoadingOrError();
697
+ } else {
698
+ const __previousQueryOptions = activeQuery.options; // Trigger a fetch in order to trigger suspense as well.
699
+
700
+ activeQuery.fetch({ ...__previousQueryOptions,
701
+ queryFn: () => {
702
+ return new Promise(() => {// Never resolve
703
+ });
704
+ },
705
+ cacheTime: -1
706
+ });
707
+ activeQuery.setState({
708
+ data: undefined,
709
+ status: 'loading',
710
+ fetchMeta: { ...activeQuery.state.fetchMeta,
711
+ __previousQueryOptions
712
+ }
713
+ });
714
+ }
715
+ },
716
+ style: {
717
+ background: defaultTheme.paused
718
+ }
719
+ }, activeQuery.state.status === 'loading' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React.createElement(Button, {
720
+ type: "button",
721
+ onClick: () => {
722
+ if (!activeQuery.state.error) {
723
+ triggerError();
724
+ } else {
725
+ queryClient.resetQueries(activeQuery);
726
+ }
727
+ },
728
+ style: {
729
+ background: defaultTheme.danger
730
+ }
731
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React.createElement("label", null, "Trigger error:", /*#__PURE__*/React.createElement(Select, {
732
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
733
+ style: {
734
+ marginInlineStart: '.5em'
735
+ },
736
+ onChange: e => {
737
+ const errorType = errorTypes.find(t => t.name === e.target.value);
738
+ triggerError(errorType);
739
+ }
740
+ }, /*#__PURE__*/React.createElement("option", {
741
+ key: "",
742
+ value: ""
743
+ }), errorTypes.map(errorType => /*#__PURE__*/React.createElement("option", {
744
+ key: errorType.name,
745
+ value: errorType.name
746
+ }, errorType.name))))), /*#__PURE__*/React.createElement("div", {
647
747
  style: {
648
748
  background: defaultTheme.backgroundAlt,
649
749
  padding: '.5em',