@tanstack/react-query-devtools 5.0.0-alpha.0 → 5.0.0-alpha.10

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 (47) hide show
  1. package/build/lib/Explorer.esm.js +2 -1
  2. package/build/lib/Explorer.esm.js.map +1 -1
  3. package/build/lib/Explorer.js +2 -1
  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 +20 -2
  8. package/build/lib/devtools.esm.js +161 -34
  9. package/build/lib/devtools.esm.js.map +1 -1
  10. package/build/lib/devtools.js +160 -34
  11. package/build/lib/devtools.js.map +1 -1
  12. package/build/lib/devtools.mjs +105 -9
  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 +164 -36
  21. package/build/lib/index.prod.esm.js.map +1 -1
  22. package/build/lib/index.prod.js +163 -36
  23. package/build/lib/index.prod.js.map +1 -1
  24. package/build/lib/index.prod.mjs +107 -10
  25. package/build/lib/index.prod.mjs.map +1 -1
  26. package/build/lib/styledComponents.d.ts +0 -1
  27. package/build/lib/styledComponents.esm.js +3 -1
  28. package/build/lib/styledComponents.esm.js.map +1 -1
  29. package/build/lib/styledComponents.js +3 -1
  30. package/build/lib/styledComponents.js.map +1 -1
  31. package/build/lib/styledComponents.mjs +3 -1
  32. package/build/lib/styledComponents.mjs.map +1 -1
  33. package/build/lib/theme.esm.js +1 -0
  34. package/build/lib/theme.esm.js.map +1 -1
  35. package/build/lib/theme.js +1 -0
  36. package/build/lib/theme.js.map +1 -1
  37. package/build/lib/theme.mjs +1 -0
  38. package/build/lib/theme.mjs.map +1 -1
  39. package/build/umd/index.development.js +106 -10
  40. package/build/umd/index.development.js.map +1 -1
  41. package/build/umd/index.production.js.map +1 -1
  42. package/package.json +4 -4
  43. package/src/__tests__/Explorer.test.tsx +3 -2
  44. package/src/__tests__/devtools.test.tsx +163 -14
  45. package/src/devtools.tsx +150 -3
  46. package/src/index.ts +2 -0
  47. package/src/styledComponents.ts +3 -1
@@ -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';
@@ -330,7 +331,9 @@ const Button = styled('button', (props, theme) => ({
330
331
  cursor: 'pointer'
331
332
  }));
332
333
  const QueryKeys = styled('span', {
333
- display: 'inline-block',
334
+ display: 'flex',
335
+ flexWrap: 'wrap',
336
+ gap: '0.5em',
334
337
  fontSize: '0.9em'
335
338
  });
336
339
  const QueryKey = styled('span', {
@@ -593,7 +596,7 @@ function Explorer({
593
596
  const makeProperty = sub => {
594
597
  const subDefaultExpanded = defaultExpanded === true ? {
595
598
  [sub.label]: true
596
- } : defaultExpanded?.[sub.label];
599
+ } : defaultExpanded == null ? void 0 : defaultExpanded[sub.label];
597
600
  return {
598
601
  ...sub,
599
602
  defaultExpanded: subDefaultExpanded
@@ -674,7 +677,8 @@ function ReactQueryDevtools$1({
674
677
  containerElement: Container = 'aside',
675
678
  queryClient,
676
679
  styleNonce,
677
- panelPosition: initialPanelPosition = 'bottom'
680
+ panelPosition: initialPanelPosition = 'bottom',
681
+ errorTypes = []
678
682
  }) {
679
683
  const rootRef = React.useRef(null);
680
684
  const panelRef = React.useRef(null);
@@ -727,7 +731,7 @@ function ReactQueryDevtools$1({
727
731
  document.addEventListener('mouseup', unsub, false);
728
732
  };
729
733
  React.useEffect(() => {
730
- setIsResolvedOpen(isOpen ?? false);
734
+ setIsResolvedOpen(isOpen != null ? isOpen : false);
731
735
  }, [isOpen, isResolvedOpen, setIsResolvedOpen]);
732
736
 
733
737
  // Toggle panel visibility before/after transition (depending on direction).
@@ -755,7 +759,8 @@ function ReactQueryDevtools$1({
755
759
  return;
756
760
  }, [isResolvedOpen]);
757
761
  React.useEffect(() => {
758
- if (isResolvedOpen && rootRef.current?.parentElement) {
762
+ var _rootRef$current;
763
+ if (isResolvedOpen && (_rootRef$current = rootRef.current) != null && _rootRef$current.parentElement) {
759
764
  const {
760
765
  parentElement
761
766
  } = rootRef.current;
@@ -839,7 +844,8 @@ function ReactQueryDevtools$1({
839
844
  style: style,
840
845
  isOpen: isResolvedOpen,
841
846
  setIsOpen: setIsOpen,
842
- onDragStart: e => handleDragStart(panelRef.current, e)
847
+ onDragStart: e => handleDragStart(panelRef.current, e),
848
+ errorTypes: errorTypes
843
849
  }))), !isResolvedOpen ? /*#__PURE__*/React.createElement("button", _extends({
844
850
  type: "button"
845
851
  }, otherToggleButtonProps, {
@@ -849,7 +855,7 @@ function ReactQueryDevtools$1({
849
855
  "aria-expanded": "false",
850
856
  onClick: e => {
851
857
  setIsOpen(true);
852
- onToggleClick?.(e);
858
+ onToggleClick == null ? void 0 : onToggleClick(e);
853
859
  },
854
860
  style: {
855
861
  background: 'none',
@@ -902,6 +908,7 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
902
908
  showCloseButton,
903
909
  position,
904
910
  closeButtonProps = {},
911
+ errorTypes = [],
905
912
  ...panelProps
906
913
  } = props;
907
914
  const {
@@ -1035,19 +1042,20 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1035
1042
  }, "Bottom")) : null), /*#__PURE__*/React.createElement("div", {
1036
1043
  style: {
1037
1044
  display: 'flex',
1038
- alignItems: 'center'
1045
+ alignItems: 'center',
1046
+ flexWrap: 'wrap',
1047
+ gap: '0.5em'
1039
1048
  }
1040
1049
  }, /*#__PURE__*/React.createElement(Input, {
1041
1050
  placeholder: "Filter",
1042
1051
  "aria-label": "Filter by queryhash",
1043
- value: filter ?? '',
1052
+ value: filter != null ? filter : '',
1044
1053
  onChange: e => setFilter(e.target.value),
1045
1054
  onKeyDown: e => {
1046
1055
  if (e.key === 'Escape') setFilter('');
1047
1056
  },
1048
1057
  style: {
1049
1058
  flex: '1',
1050
- marginRight: '.5em',
1051
1059
  width: '100%'
1052
1060
  }
1053
1061
  }), /*#__PURE__*/React.createElement(Select, {
@@ -1147,7 +1155,8 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1147
1155
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
1148
1156
  activeQueryHash: activeQueryHash,
1149
1157
  queryCache: queryCache,
1150
- queryClient: client
1158
+ queryClient: client,
1159
+ errorTypes: errorTypes
1151
1160
  }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
1152
1161
  type: "button",
1153
1162
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -1164,26 +1173,67 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1164
1173
  },
1165
1174
  onClick: e => {
1166
1175
  setIsOpen(false);
1167
- onCloseClick?.(e);
1176
+ onCloseClick == null ? void 0 : onCloseClick(e);
1168
1177
  }
1169
1178
  }), "Close") : null));
1170
1179
  });
1171
1180
  const ActiveQuery = ({
1172
1181
  queryCache,
1173
1182
  activeQueryHash,
1174
- queryClient
1183
+ queryClient,
1184
+ errorTypes
1175
1185
  }) => {
1186
+ var _useSubscribeToQueryC, _useSubscribeToQueryC2;
1176
1187
  const activeQuery = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash));
1177
- const activeQueryState = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.state);
1178
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.isStale()) ?? false;
1179
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.getObserversCount()) ?? 0;
1188
+ const activeQueryState = useSubscribeToQueryCache(queryCache, () => {
1189
+ var _queryCache$getAll$fi;
1190
+ return (_queryCache$getAll$fi = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi.state;
1191
+ });
1192
+ const isStale = (_useSubscribeToQueryC = useSubscribeToQueryCache(queryCache, () => {
1193
+ var _queryCache$getAll$fi2;
1194
+ return (_queryCache$getAll$fi2 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi2.isStale();
1195
+ })) != null ? _useSubscribeToQueryC : false;
1196
+ const observerCount = (_useSubscribeToQueryC2 = useSubscribeToQueryCache(queryCache, () => {
1197
+ var _queryCache$getAll$fi3;
1198
+ return (_queryCache$getAll$fi3 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi3.getObserversCount();
1199
+ })) != null ? _useSubscribeToQueryC2 : 0;
1180
1200
  const handleRefetch = () => {
1181
- const promise = activeQuery?.fetch();
1182
- promise?.catch(noop);
1201
+ const promise = activeQuery == null ? void 0 : activeQuery.fetch();
1202
+ promise == null ? void 0 : promise.catch(noop);
1183
1203
  };
1204
+ const currentErrorTypeName = useMemo(() => {
1205
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
1206
+ const errorType = errorTypes.find(type => {
1207
+ var _activeQueryState$err;
1208
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
1209
+ });
1210
+ return errorType == null ? void 0 : errorType.name;
1211
+ }
1212
+ return undefined;
1213
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
1184
1214
  if (!activeQuery || !activeQueryState) {
1185
1215
  return null;
1186
1216
  }
1217
+ const triggerError = errorType => {
1218
+ var _errorType$initialize;
1219
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
1220
+ const __previousQueryOptions = activeQuery.options;
1221
+ activeQuery.setState({
1222
+ status: 'error',
1223
+ error,
1224
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1225
+ fetchMeta: {
1226
+ ...activeQuery.state.fetchMeta,
1227
+ __previousQueryOptions
1228
+ }
1229
+ });
1230
+ };
1231
+ const restoreQueryAfterLoadingOrError = () => {
1232
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
1233
+ // Make sure this fetch will cancel the previous one
1234
+ cancelRefetch: true
1235
+ });
1236
+ };
1187
1237
  return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
1188
1238
  style: {
1189
1239
  padding: '.5em',
@@ -1200,7 +1250,7 @@ const ActiveQuery = ({
1200
1250
  style: {
1201
1251
  marginBottom: '.5em',
1202
1252
  display: 'flex',
1203
- alignItems: 'stretch',
1253
+ alignItems: 'flex-start',
1204
1254
  justifyContent: 'space-between'
1205
1255
  }
1206
1256
  }, /*#__PURE__*/React.createElement(Code, {
@@ -1250,7 +1300,11 @@ const ActiveQuery = ({
1250
1300
  }
1251
1301
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
1252
1302
  style: {
1253
- padding: '0.5em'
1303
+ padding: '0.5em',
1304
+ display: 'flex',
1305
+ flexWrap: 'wrap',
1306
+ gap: '0.5em',
1307
+ alignItems: 'flex-end'
1254
1308
  }
1255
1309
  }, /*#__PURE__*/React.createElement(Button, {
1256
1310
  type: "button",
@@ -1278,7 +1332,65 @@ const ActiveQuery = ({
1278
1332
  style: {
1279
1333
  background: defaultTheme.danger
1280
1334
  }
1281
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
1335
+ }, "Remove"), ' ', /*#__PURE__*/React.createElement(Button, {
1336
+ type: "button",
1337
+ onClick: () => {
1338
+ if (activeQuery.state.data === undefined) {
1339
+ restoreQueryAfterLoadingOrError();
1340
+ } else {
1341
+ const __previousQueryOptions = activeQuery.options;
1342
+ // Trigger a fetch in order to trigger suspense as well.
1343
+ activeQuery.fetch({
1344
+ ...__previousQueryOptions,
1345
+ queryFn: () => {
1346
+ return new Promise(() => {
1347
+ // Never resolve
1348
+ });
1349
+ },
1350
+ gcTime: -1
1351
+ });
1352
+ activeQuery.setState({
1353
+ data: undefined,
1354
+ status: 'pending',
1355
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1356
+ fetchMeta: {
1357
+ ...activeQuery.state.fetchMeta,
1358
+ __previousQueryOptions
1359
+ }
1360
+ });
1361
+ }
1362
+ },
1363
+ style: {
1364
+ background: defaultTheme.paused
1365
+ }
1366
+ }, activeQuery.state.status === 'pending' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React.createElement(Button, {
1367
+ type: "button",
1368
+ onClick: () => {
1369
+ if (!activeQuery.state.error) {
1370
+ triggerError();
1371
+ } else {
1372
+ queryClient.resetQueries(activeQuery);
1373
+ }
1374
+ },
1375
+ style: {
1376
+ background: defaultTheme.danger
1377
+ }
1378
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React.createElement("label", null, "Trigger error:", /*#__PURE__*/React.createElement(Select, {
1379
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
1380
+ style: {
1381
+ marginInlineStart: '.5em'
1382
+ },
1383
+ onChange: e => {
1384
+ const errorType = errorTypes.find(t => t.name === e.target.value);
1385
+ triggerError(errorType);
1386
+ }
1387
+ }, /*#__PURE__*/React.createElement("option", {
1388
+ key: "",
1389
+ value: ""
1390
+ }), errorTypes.map(errorType => /*#__PURE__*/React.createElement("option", {
1391
+ key: errorType.name,
1392
+ value: errorType.name
1393
+ }, errorType.name))))), /*#__PURE__*/React.createElement("div", {
1282
1394
  style: {
1283
1395
  background: defaultTheme.backgroundAlt,
1284
1396
  padding: '.5em',
@@ -1358,21 +1470,37 @@ const QueryRow = /*#__PURE__*/React.memo(({
1358
1470
  activeQueryHash,
1359
1471
  queryCache
1360
1472
  }) => {
1361
- const queryHash = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1362
- queryKey
1363
- })?.queryHash) ?? '';
1364
- const queryState = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1365
- queryKey
1366
- })?.state);
1367
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1368
- queryKey
1369
- })?.isStale()) ?? false;
1370
- const isDisabled = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1371
- queryKey
1372
- })?.isDisabled()) ?? false;
1373
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1374
- queryKey
1375
- })?.getObserversCount()) ?? 0;
1473
+ var _useSubscribeToQueryC3, _useSubscribeToQueryC4, _useSubscribeToQueryC5, _useSubscribeToQueryC6;
1474
+ const queryHash = (_useSubscribeToQueryC3 = useSubscribeToQueryCache(queryCache, () => {
1475
+ var _queryCache$find;
1476
+ return (_queryCache$find = queryCache.find({
1477
+ queryKey
1478
+ })) == null ? void 0 : _queryCache$find.queryHash;
1479
+ })) != null ? _useSubscribeToQueryC3 : '';
1480
+ const queryState = useSubscribeToQueryCache(queryCache, () => {
1481
+ var _queryCache$find2;
1482
+ return (_queryCache$find2 = queryCache.find({
1483
+ queryKey
1484
+ })) == null ? void 0 : _queryCache$find2.state;
1485
+ });
1486
+ const isStale = (_useSubscribeToQueryC4 = useSubscribeToQueryCache(queryCache, () => {
1487
+ var _queryCache$find3;
1488
+ return (_queryCache$find3 = queryCache.find({
1489
+ queryKey
1490
+ })) == null ? void 0 : _queryCache$find3.isStale();
1491
+ })) != null ? _useSubscribeToQueryC4 : false;
1492
+ const isDisabled = (_useSubscribeToQueryC5 = useSubscribeToQueryCache(queryCache, () => {
1493
+ var _queryCache$find4;
1494
+ return (_queryCache$find4 = queryCache.find({
1495
+ queryKey
1496
+ })) == null ? void 0 : _queryCache$find4.isDisabled();
1497
+ })) != null ? _useSubscribeToQueryC5 : false;
1498
+ const observerCount = (_useSubscribeToQueryC6 = useSubscribeToQueryCache(queryCache, () => {
1499
+ var _queryCache$find5;
1500
+ return (_queryCache$find5 = queryCache.find({
1501
+ queryKey
1502
+ })) == null ? void 0 : _queryCache$find5.getObserversCount();
1503
+ })) != null ? _useSubscribeToQueryC6 : 0;
1376
1504
  if (!queryState) {
1377
1505
  return null;
1378
1506
  }