@tanstack/react-query-devtools 5.0.0-alpha.1 → 5.0.0-alpha.11

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 +162 -34
  9. package/build/lib/devtools.esm.js.map +1 -1
  10. package/build/lib/devtools.js +161 -34
  11. package/build/lib/devtools.js.map +1 -1
  12. package/build/lib/devtools.mjs +106 -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 +165 -36
  21. package/build/lib/index.prod.esm.js.map +1 -1
  22. package/build/lib/index.prod.js +164 -36
  23. package/build/lib/index.prod.js.map +1 -1
  24. package/build/lib/index.prod.mjs +108 -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 +107 -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 +183 -9
  45. package/src/devtools.tsx +151 -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, {
@@ -1079,6 +1087,7 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1079
1087
  } else {
1080
1088
  onlineManager.setOnline(false);
1081
1089
  setMockOffline(true);
1090
+ window.dispatchEvent(new Event('offline'));
1082
1091
  }
1083
1092
  },
1084
1093
  "aria-label": isMockOffline ? 'Restore offline mock' : 'Mock offline behavior',
@@ -1147,7 +1156,8 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1147
1156
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React.createElement(ActiveQuery, {
1148
1157
  activeQueryHash: activeQueryHash,
1149
1158
  queryCache: queryCache,
1150
- queryClient: client
1159
+ queryClient: client,
1160
+ errorTypes: errorTypes
1151
1161
  }) : null, showCloseButton ? /*#__PURE__*/React.createElement(Button, _extends({
1152
1162
  type: "button",
1153
1163
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -1164,26 +1174,67 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React.forwardRef(function ReactQu
1164
1174
  },
1165
1175
  onClick: e => {
1166
1176
  setIsOpen(false);
1167
- onCloseClick?.(e);
1177
+ onCloseClick == null ? void 0 : onCloseClick(e);
1168
1178
  }
1169
1179
  }), "Close") : null));
1170
1180
  });
1171
1181
  const ActiveQuery = ({
1172
1182
  queryCache,
1173
1183
  activeQueryHash,
1174
- queryClient
1184
+ queryClient,
1185
+ errorTypes
1175
1186
  }) => {
1187
+ var _useSubscribeToQueryC, _useSubscribeToQueryC2;
1176
1188
  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;
1189
+ const activeQueryState = useSubscribeToQueryCache(queryCache, () => {
1190
+ var _queryCache$getAll$fi;
1191
+ return (_queryCache$getAll$fi = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi.state;
1192
+ });
1193
+ const isStale = (_useSubscribeToQueryC = useSubscribeToQueryCache(queryCache, () => {
1194
+ var _queryCache$getAll$fi2;
1195
+ return (_queryCache$getAll$fi2 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi2.isStale();
1196
+ })) != null ? _useSubscribeToQueryC : false;
1197
+ const observerCount = (_useSubscribeToQueryC2 = useSubscribeToQueryCache(queryCache, () => {
1198
+ var _queryCache$getAll$fi3;
1199
+ return (_queryCache$getAll$fi3 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi3.getObserversCount();
1200
+ })) != null ? _useSubscribeToQueryC2 : 0;
1180
1201
  const handleRefetch = () => {
1181
- const promise = activeQuery?.fetch();
1182
- promise?.catch(noop);
1202
+ const promise = activeQuery == null ? void 0 : activeQuery.fetch();
1203
+ promise == null ? void 0 : promise.catch(noop);
1183
1204
  };
1205
+ const currentErrorTypeName = useMemo(() => {
1206
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
1207
+ const errorType = errorTypes.find(type => {
1208
+ var _activeQueryState$err;
1209
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
1210
+ });
1211
+ return errorType == null ? void 0 : errorType.name;
1212
+ }
1213
+ return undefined;
1214
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
1184
1215
  if (!activeQuery || !activeQueryState) {
1185
1216
  return null;
1186
1217
  }
1218
+ const triggerError = errorType => {
1219
+ var _errorType$initialize;
1220
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
1221
+ const __previousQueryOptions = activeQuery.options;
1222
+ activeQuery.setState({
1223
+ status: 'error',
1224
+ error,
1225
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1226
+ fetchMeta: {
1227
+ ...activeQuery.state.fetchMeta,
1228
+ __previousQueryOptions
1229
+ }
1230
+ });
1231
+ };
1232
+ const restoreQueryAfterLoadingOrError = () => {
1233
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
1234
+ // Make sure this fetch will cancel the previous one
1235
+ cancelRefetch: true
1236
+ });
1237
+ };
1187
1238
  return /*#__PURE__*/React.createElement(ActiveQueryPanel, null, /*#__PURE__*/React.createElement("div", {
1188
1239
  style: {
1189
1240
  padding: '.5em',
@@ -1200,7 +1251,7 @@ const ActiveQuery = ({
1200
1251
  style: {
1201
1252
  marginBottom: '.5em',
1202
1253
  display: 'flex',
1203
- alignItems: 'stretch',
1254
+ alignItems: 'flex-start',
1204
1255
  justifyContent: 'space-between'
1205
1256
  }
1206
1257
  }, /*#__PURE__*/React.createElement(Code, {
@@ -1250,7 +1301,11 @@ const ActiveQuery = ({
1250
1301
  }
1251
1302
  }, "Actions"), /*#__PURE__*/React.createElement("div", {
1252
1303
  style: {
1253
- padding: '0.5em'
1304
+ padding: '0.5em',
1305
+ display: 'flex',
1306
+ flexWrap: 'wrap',
1307
+ gap: '0.5em',
1308
+ alignItems: 'flex-end'
1254
1309
  }
1255
1310
  }, /*#__PURE__*/React.createElement(Button, {
1256
1311
  type: "button",
@@ -1278,7 +1333,65 @@ const ActiveQuery = ({
1278
1333
  style: {
1279
1334
  background: defaultTheme.danger
1280
1335
  }
1281
- }, "Remove")), /*#__PURE__*/React.createElement("div", {
1336
+ }, "Remove"), ' ', /*#__PURE__*/React.createElement(Button, {
1337
+ type: "button",
1338
+ onClick: () => {
1339
+ if (activeQuery.state.data === undefined) {
1340
+ restoreQueryAfterLoadingOrError();
1341
+ } else {
1342
+ const __previousQueryOptions = activeQuery.options;
1343
+ // Trigger a fetch in order to trigger suspense as well.
1344
+ activeQuery.fetch({
1345
+ ...__previousQueryOptions,
1346
+ queryFn: () => {
1347
+ return new Promise(() => {
1348
+ // Never resolve
1349
+ });
1350
+ },
1351
+ gcTime: -1
1352
+ });
1353
+ activeQuery.setState({
1354
+ data: undefined,
1355
+ status: 'pending',
1356
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1357
+ fetchMeta: {
1358
+ ...activeQuery.state.fetchMeta,
1359
+ __previousQueryOptions
1360
+ }
1361
+ });
1362
+ }
1363
+ },
1364
+ style: {
1365
+ background: defaultTheme.paused
1366
+ }
1367
+ }, activeQuery.state.status === 'pending' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React.createElement(Button, {
1368
+ type: "button",
1369
+ onClick: () => {
1370
+ if (!activeQuery.state.error) {
1371
+ triggerError();
1372
+ } else {
1373
+ queryClient.resetQueries(activeQuery);
1374
+ }
1375
+ },
1376
+ style: {
1377
+ background: defaultTheme.danger
1378
+ }
1379
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React.createElement("label", null, "Trigger error:", /*#__PURE__*/React.createElement(Select, {
1380
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
1381
+ style: {
1382
+ marginInlineStart: '.5em'
1383
+ },
1384
+ onChange: e => {
1385
+ const errorType = errorTypes.find(t => t.name === e.target.value);
1386
+ triggerError(errorType);
1387
+ }
1388
+ }, /*#__PURE__*/React.createElement("option", {
1389
+ key: "",
1390
+ value: ""
1391
+ }), errorTypes.map(errorType => /*#__PURE__*/React.createElement("option", {
1392
+ key: errorType.name,
1393
+ value: errorType.name
1394
+ }, errorType.name))))), /*#__PURE__*/React.createElement("div", {
1282
1395
  style: {
1283
1396
  background: defaultTheme.backgroundAlt,
1284
1397
  padding: '.5em',
@@ -1358,21 +1471,37 @@ const QueryRow = /*#__PURE__*/React.memo(({
1358
1471
  activeQueryHash,
1359
1472
  queryCache
1360
1473
  }) => {
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;
1474
+ var _useSubscribeToQueryC3, _useSubscribeToQueryC4, _useSubscribeToQueryC5, _useSubscribeToQueryC6;
1475
+ const queryHash = (_useSubscribeToQueryC3 = useSubscribeToQueryCache(queryCache, () => {
1476
+ var _queryCache$find;
1477
+ return (_queryCache$find = queryCache.find({
1478
+ queryKey
1479
+ })) == null ? void 0 : _queryCache$find.queryHash;
1480
+ })) != null ? _useSubscribeToQueryC3 : '';
1481
+ const queryState = useSubscribeToQueryCache(queryCache, () => {
1482
+ var _queryCache$find2;
1483
+ return (_queryCache$find2 = queryCache.find({
1484
+ queryKey
1485
+ })) == null ? void 0 : _queryCache$find2.state;
1486
+ });
1487
+ const isStale = (_useSubscribeToQueryC4 = useSubscribeToQueryCache(queryCache, () => {
1488
+ var _queryCache$find3;
1489
+ return (_queryCache$find3 = queryCache.find({
1490
+ queryKey
1491
+ })) == null ? void 0 : _queryCache$find3.isStale();
1492
+ })) != null ? _useSubscribeToQueryC4 : false;
1493
+ const isDisabled = (_useSubscribeToQueryC5 = useSubscribeToQueryCache(queryCache, () => {
1494
+ var _queryCache$find4;
1495
+ return (_queryCache$find4 = queryCache.find({
1496
+ queryKey
1497
+ })) == null ? void 0 : _queryCache$find4.isDisabled();
1498
+ })) != null ? _useSubscribeToQueryC5 : false;
1499
+ const observerCount = (_useSubscribeToQueryC6 = useSubscribeToQueryCache(queryCache, () => {
1500
+ var _queryCache$find5;
1501
+ return (_queryCache$find5 = queryCache.find({
1502
+ queryKey
1503
+ })) == null ? void 0 : _queryCache$find5.getObserversCount();
1504
+ })) != null ? _useSubscribeToQueryC6 : 0;
1376
1505
  if (!queryState) {
1377
1506
  return null;
1378
1507
  }