@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.mjs","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","e","background","border","zIndex","display","fontSize","margin","cursor","top","right","left","bottom","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","__html","backgroundAlt","gray","getResizeHandleStyle","flex","minHeight","maxHeight","overflow","borderRight","grayAlt","flexDirection","justifyContent","alignItems","marginRight","marginBottom","marginInlineStart","target","value","key","minWidth","map","old","onlineManager","setOnline","undefined","dispatchEvent","Event","danger","overflowY","query","queryKey","ActiveQuery","activeQuery","find","activeQueryState","state","isStale","observerCount","getObserversCount","handleRefetch","promise","fetch","catch","noop","lineHeight","displayValue","borderRadius","fontWeight","textShadow","getQueryStatusColor","queryState","flexShrink","getQueryStatusLabel","Date","dataUpdatedAt","toLocaleTimeString","fetchStatus","active","invalidateQueries","warning","color","inputTextColor","resetQueries","removeQueries","data","QueryStatusCount","hasFresh","q","hasFetching","hasPaused","hasStale","hasInactive","success","opacity","paused","QueryRow","memo","isDisabled","borderBottom"],"mappings":"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"}
1
+ {"version":3,"file":"devtools.mjs","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":"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"}
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { ReactQueryDevtools as ReactQueryDevtools$1, ReactQueryDevtoolsPanel as ReactQueryDevtoolsPanel$1 } from './devtools.esm.js';
2
3
 
3
4
  const ReactQueryDevtools = process.env.NODE_ENV !== 'development' ? function () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":["ReactQueryDevtools","process","env","NODE_ENV","devtools","ReactQueryDevtoolsPanel"],"mappings":";;AAIO,MAAMA,kBAAyD,GACpEC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACI,YAAY;AACV,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC,qBALC;AAOA,MAAMC,uBAAmE,GAC9EJ,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACK,YAAY;AACX,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC;;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":[],"mappings":";;;AAIO;AAGC;AACD;AAGA;AAGC;AACD;;"}
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  'use strict';
2
3
 
3
4
  Object.defineProperty(exports, '__esModule', { value: true });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":["ReactQueryDevtools","process","env","NODE_ENV","devtools","ReactQueryDevtoolsPanel"],"mappings":";;;;;;AAIO,MAAMA,kBAAyD,GACpEC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACI,YAAY;AACV,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC,4BALC;AAOA,MAAMC,uBAAmE,GAC9EJ,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACK,YAAY;AACX,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":[],"mappings":";;;;;;;AAIO;AAGC;AACD;AAGA;AAGC;AACD;;;"}
@@ -1,3 +1,4 @@
1
+ 'use client';
1
2
  import { ReactQueryDevtools as ReactQueryDevtools$1, ReactQueryDevtoolsPanel as ReactQueryDevtoolsPanel$1 } from './devtools.mjs';
2
3
 
3
4
  const ReactQueryDevtools = process.env.NODE_ENV !== 'development' ? function () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":["ReactQueryDevtools","process","env","NODE_ENV","devtools","ReactQueryDevtoolsPanel"],"mappings":";;AAIO,MAAMA,kBAAyD,GACpEC,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACI,YAAY;AACV,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC,qBALC;AAOA,MAAMC,uBAAmE,GAC9EJ,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,aAAzB,GACK,YAAY;AACX,EAAA,OAAO,IAAP,CAAA;AACD,CAHL,GAIIC;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/index.ts"],"sourcesContent":["'use client'\n\nimport * as devtools from './devtools'\n\nexport const ReactQueryDevtools: typeof devtools['ReactQueryDevtools'] =\n process.env.NODE_ENV !== 'development'\n ? function () {\n return null\n }\n : devtools.ReactQueryDevtools\n\nexport const ReactQueryDevtoolsPanel: typeof devtools['ReactQueryDevtoolsPanel'] =\n process.env.NODE_ENV !== 'development'\n ? (function () {\n return null\n } as any)\n : devtools.ReactQueryDevtoolsPanel\n"],"names":[],"mappings":";;;AAIO;AAGC;AACD;AAGA;AAGC;AACD;;"}
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { useMemo } from 'react';
2
3
  import { useQueryClient, onlineManager, notifyManager } from '@tanstack/react-query';
3
4
  import { rankItem } from '@tanstack/match-sorter-utils';
4
5
  import SuperJSON from 'superjson';
@@ -341,7 +342,9 @@ const Button = styled('button', (props, theme) => ({
341
342
  cursor: 'pointer'
342
343
  }));
343
344
  const QueryKeys = styled('span', {
344
- display: 'inline-block',
345
+ display: 'flex',
346
+ flexWrap: 'wrap',
347
+ gap: '0.5em',
345
348
  fontSize: '0.9em'
346
349
  });
347
350
  const QueryKey = styled('span', {
@@ -695,7 +698,8 @@ function ReactQueryDevtools$1({
695
698
  containerElement: Container = 'aside',
696
699
  context,
697
700
  styleNonce,
698
- panelPosition: initialPanelPosition = 'bottom'
701
+ panelPosition: initialPanelPosition = 'bottom',
702
+ errorTypes = []
699
703
  }) {
700
704
  const rootRef = React.useRef(null);
701
705
  const panelRef = React.useRef(null);
@@ -874,7 +878,8 @@ function ReactQueryDevtools$1({
874
878
  style: style,
875
879
  isOpen: isResolvedOpen,
876
880
  setIsOpen: setIsOpen,
877
- onDragStart: e => handleDragStart(panelRef.current, e)
881
+ onDragStart: e => handleDragStart(panelRef.current, e),
882
+ errorTypes: errorTypes
878
883
  }))), !isResolvedOpen ? /*#__PURE__*/React.createElement("button", _extends({
879
884
  type: "button"
880
885
  }, otherToggleButtonProps, {
@@ -939,6 +944,7 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
939
944
  showCloseButton,
940
945
  position,
941
946
  closeButtonProps = {},
947
+ errorTypes = [],
942
948
  ...panelProps
943
949
  } = props;
944
950
  const {
@@ -1057,7 +1063,9 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1057
1063
  }, "Bottom")) : null), /*#__PURE__*/React.createElement("div", {
1058
1064
  style: {
1059
1065
  display: 'flex',
1060
- alignItems: 'center'
1066
+ alignItems: 'center',
1067
+ flexWrap: 'wrap',
1068
+ gap: '0.5em'
1061
1069
  }
1062
1070
  }, /*#__PURE__*/React.createElement(Input, {
1063
1071
  placeholder: "Filter",
@@ -1069,7 +1077,6 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1069
1077
  },
1070
1078
  style: {
1071
1079
  flex: '1',
1072
- marginRight: '.5em',
1073
1080
  width: '100%'
1074
1081
  }
1075
1082
  }), /*#__PURE__*/React.createElement(Select, {
@@ -1169,7 +1176,8 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1169
1176
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
1170
1177
  activeQueryHash: activeQueryHash,
1171
1178
  queryCache: queryCache,
1172
- queryClient: queryClient
1179
+ queryClient: queryClient,
1180
+ errorTypes: errorTypes
1173
1181
  }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
1174
1182
  type: "button",
1175
1183
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -1194,7 +1202,8 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1194
1202
  const ActiveQuery = ({
1195
1203
  queryCache,
1196
1204
  activeQueryHash,
1197
- queryClient
1205
+ queryClient,
1206
+ errorTypes
1198
1207
  }) => {
1199
1208
  var _useSubscribeToQueryC, _useSubscribeToQueryC2;
1200
1209
 
@@ -1220,10 +1229,44 @@ const ActiveQuery = ({
1220
1229
  promise == null ? void 0 : promise.catch(noop);
1221
1230
  };
1222
1231
 
1232
+ const currentErrorTypeName = useMemo(() => {
1233
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
1234
+ const errorType = errorTypes.find(type => {
1235
+ var _activeQueryState$err;
1236
+
1237
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
1238
+ });
1239
+ return errorType == null ? void 0 : errorType.name;
1240
+ }
1241
+
1242
+ return undefined;
1243
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
1244
+
1223
1245
  if (!activeQuery || !activeQueryState) {
1224
1246
  return null;
1225
1247
  }
1226
1248
 
1249
+ const triggerError = errorType => {
1250
+ var _errorType$initialize;
1251
+
1252
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
1253
+ const __previousQueryOptions = activeQuery.options;
1254
+ activeQuery.setState({
1255
+ status: 'error',
1256
+ error,
1257
+ fetchMeta: { ...activeQuery.state.fetchMeta,
1258
+ __previousQueryOptions
1259
+ }
1260
+ });
1261
+ };
1262
+
1263
+ const restoreQueryAfterLoadingOrError = () => {
1264
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
1265
+ // Make sure this fetch will cancel the previous one
1266
+ cancelRefetch: true
1267
+ });
1268
+ };
1269
+
1227
1270
  return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
1228
1271
  style: {
1229
1272
  padding: '.5em',
@@ -1290,7 +1333,11 @@ const ActiveQuery = ({
1290
1333
  }
1291
1334
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
1292
1335
  style: {
1293
- padding: '0.5em'
1336
+ padding: '0.5em',
1337
+ display: 'flex',
1338
+ flexWrap: 'wrap',
1339
+ gap: '0.5em',
1340
+ alignItems: 'flex-end'
1294
1341
  }
1295
1342
  }, /*#__PURE__*/React.createElement(Button, {
1296
1343
  type: "button",
@@ -1318,7 +1365,61 @@ const ActiveQuery = ({
1318
1365
  style: {
1319
1366
  background: defaultTheme.danger
1320
1367
  }
1321
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
1368
+ }, "Remove"), ' ', /*#__PURE__*/React.createElement(Button, {
1369
+ type: "button",
1370
+ onClick: () => {
1371
+ if (activeQuery.state.data === undefined) {
1372
+ restoreQueryAfterLoadingOrError();
1373
+ } else {
1374
+ const __previousQueryOptions = activeQuery.options; // Trigger a fetch in order to trigger suspense as well.
1375
+
1376
+ activeQuery.fetch({ ...__previousQueryOptions,
1377
+ queryFn: () => {
1378
+ return new Promise(() => {// Never resolve
1379
+ });
1380
+ },
1381
+ cacheTime: -1
1382
+ });
1383
+ activeQuery.setState({
1384
+ data: undefined,
1385
+ status: 'loading',
1386
+ fetchMeta: { ...activeQuery.state.fetchMeta,
1387
+ __previousQueryOptions
1388
+ }
1389
+ });
1390
+ }
1391
+ },
1392
+ style: {
1393
+ background: defaultTheme.paused
1394
+ }
1395
+ }, activeQuery.state.status === 'loading' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React.createElement(Button, {
1396
+ type: "button",
1397
+ onClick: () => {
1398
+ if (!activeQuery.state.error) {
1399
+ triggerError();
1400
+ } else {
1401
+ queryClient.resetQueries(activeQuery);
1402
+ }
1403
+ },
1404
+ style: {
1405
+ background: defaultTheme.danger
1406
+ }
1407
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React.createElement("label", null, "Trigger error:", /*#__PURE__*/React.createElement(Select, {
1408
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
1409
+ style: {
1410
+ marginInlineStart: '.5em'
1411
+ },
1412
+ onChange: e => {
1413
+ const errorType = errorTypes.find(t => t.name === e.target.value);
1414
+ triggerError(errorType);
1415
+ }
1416
+ }, /*#__PURE__*/React.createElement("option", {
1417
+ key: "",
1418
+ value: ""
1419
+ }), errorTypes.map(errorType => /*#__PURE__*/React.createElement("option", {
1420
+ key: errorType.name,
1421
+ value: errorType.name
1422
+ }, errorType.name))))), /*#__PURE__*/React.createElement("div", {
1322
1423
  style: {
1323
1424
  background: defaultTheme.backgroundAlt,
1324
1425
  padding: '.5em',