@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.
- package/build/lib/Explorer.esm.js +1 -0
- package/build/lib/Explorer.esm.js.map +1 -1
- package/build/lib/Explorer.js +1 -0
- package/build/lib/Explorer.js.map +1 -1
- package/build/lib/Explorer.mjs +1 -0
- package/build/lib/Explorer.mjs.map +1 -1
- package/build/lib/devtools.d.ts +23 -2
- package/build/lib/devtools.esm.js +108 -8
- package/build/lib/devtools.esm.js.map +1 -1
- package/build/lib/devtools.js +107 -8
- package/build/lib/devtools.js.map +1 -1
- package/build/lib/devtools.mjs +108 -8
- package/build/lib/devtools.mjs.map +1 -1
- package/build/lib/index.esm.js +1 -0
- package/build/lib/index.esm.js.map +1 -1
- package/build/lib/index.js +1 -0
- package/build/lib/index.js.map +1 -1
- package/build/lib/index.mjs +1 -0
- package/build/lib/index.mjs.map +1 -1
- package/build/lib/index.prod.esm.js +110 -9
- package/build/lib/index.prod.esm.js.map +1 -1
- package/build/lib/index.prod.js +109 -9
- package/build/lib/index.prod.js.map +1 -1
- package/build/lib/index.prod.mjs +110 -9
- package/build/lib/index.prod.mjs.map +1 -1
- package/build/lib/styledComponents.esm.js +3 -1
- package/build/lib/styledComponents.esm.js.map +1 -1
- package/build/lib/styledComponents.js +3 -1
- package/build/lib/styledComponents.js.map +1 -1
- package/build/lib/styledComponents.mjs +3 -1
- package/build/lib/styledComponents.mjs.map +1 -1
- package/build/lib/theme.esm.js +1 -0
- package/build/lib/theme.esm.js.map +1 -1
- package/build/lib/theme.js +1 -0
- package/build/lib/theme.js.map +1 -1
- package/build/lib/theme.mjs +1 -0
- package/build/lib/theme.mjs.map +1 -1
- package/build/umd/index.development.js +109 -9
- package/build/umd/index.development.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/devtools.test.tsx +139 -0
- package/src/devtools.tsx +144 -2
- 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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"}
|
package/build/lib/index.esm.js
CHANGED
|
@@ -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":[
|
|
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;;"}
|
package/build/lib/index.js
CHANGED
package/build/lib/index.js.map
CHANGED
|
@@ -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":[
|
|
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;;;"}
|
package/build/lib/index.mjs
CHANGED
package/build/lib/index.mjs.map
CHANGED
|
@@ -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":[
|
|
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: '
|
|
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")
|
|
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',
|