@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
@@ -351,7 +351,9 @@ const Button = styled('button', (props, theme) => ({
351
351
  cursor: 'pointer'
352
352
  }));
353
353
  const QueryKeys = styled('span', {
354
- display: 'inline-block',
354
+ display: 'flex',
355
+ flexWrap: 'wrap',
356
+ gap: '0.5em',
355
357
  fontSize: '0.9em'
356
358
  });
357
359
  const QueryKey = styled('span', {
@@ -614,7 +616,7 @@ function Explorer({
614
616
  const makeProperty = sub => {
615
617
  const subDefaultExpanded = defaultExpanded === true ? {
616
618
  [sub.label]: true
617
- } : defaultExpanded?.[sub.label];
619
+ } : defaultExpanded == null ? void 0 : defaultExpanded[sub.label];
618
620
  return {
619
621
  ...sub,
620
622
  defaultExpanded: subDefaultExpanded
@@ -695,7 +697,8 @@ function ReactQueryDevtools$1({
695
697
  containerElement: Container = 'aside',
696
698
  queryClient,
697
699
  styleNonce,
698
- panelPosition: initialPanelPosition = 'bottom'
700
+ panelPosition: initialPanelPosition = 'bottom',
701
+ errorTypes = []
699
702
  }) {
700
703
  const rootRef = React__namespace.useRef(null);
701
704
  const panelRef = React__namespace.useRef(null);
@@ -748,7 +751,7 @@ function ReactQueryDevtools$1({
748
751
  document.addEventListener('mouseup', unsub, false);
749
752
  };
750
753
  React__namespace.useEffect(() => {
751
- setIsResolvedOpen(isOpen ?? false);
754
+ setIsResolvedOpen(isOpen != null ? isOpen : false);
752
755
  }, [isOpen, isResolvedOpen, setIsResolvedOpen]);
753
756
 
754
757
  // Toggle panel visibility before/after transition (depending on direction).
@@ -776,7 +779,8 @@ function ReactQueryDevtools$1({
776
779
  return;
777
780
  }, [isResolvedOpen]);
778
781
  React__namespace.useEffect(() => {
779
- if (isResolvedOpen && rootRef.current?.parentElement) {
782
+ var _rootRef$current;
783
+ if (isResolvedOpen && (_rootRef$current = rootRef.current) != null && _rootRef$current.parentElement) {
780
784
  const {
781
785
  parentElement
782
786
  } = rootRef.current;
@@ -860,7 +864,8 @@ function ReactQueryDevtools$1({
860
864
  style: style,
861
865
  isOpen: isResolvedOpen,
862
866
  setIsOpen: setIsOpen,
863
- onDragStart: e => handleDragStart(panelRef.current, e)
867
+ onDragStart: e => handleDragStart(panelRef.current, e),
868
+ errorTypes: errorTypes
864
869
  }))), !isResolvedOpen ? /*#__PURE__*/React__namespace.createElement("button", _extends({
865
870
  type: "button"
866
871
  }, otherToggleButtonProps, {
@@ -870,7 +875,7 @@ function ReactQueryDevtools$1({
870
875
  "aria-expanded": "false",
871
876
  onClick: e => {
872
877
  setIsOpen(true);
873
- onToggleClick?.(e);
878
+ onToggleClick == null ? void 0 : onToggleClick(e);
874
879
  },
875
880
  style: {
876
881
  background: 'none',
@@ -923,6 +928,7 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React__namespace.forwardRef(funct
923
928
  showCloseButton,
924
929
  position,
925
930
  closeButtonProps = {},
931
+ errorTypes = [],
926
932
  ...panelProps
927
933
  } = props;
928
934
  const {
@@ -1056,19 +1062,20 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React__namespace.forwardRef(funct
1056
1062
  }, "Bottom")) : null), /*#__PURE__*/React__namespace.createElement("div", {
1057
1063
  style: {
1058
1064
  display: 'flex',
1059
- alignItems: 'center'
1065
+ alignItems: 'center',
1066
+ flexWrap: 'wrap',
1067
+ gap: '0.5em'
1060
1068
  }
1061
1069
  }, /*#__PURE__*/React__namespace.createElement(Input, {
1062
1070
  placeholder: "Filter",
1063
1071
  "aria-label": "Filter by queryhash",
1064
- value: filter ?? '',
1072
+ value: filter != null ? filter : '',
1065
1073
  onChange: e => setFilter(e.target.value),
1066
1074
  onKeyDown: e => {
1067
1075
  if (e.key === 'Escape') setFilter('');
1068
1076
  },
1069
1077
  style: {
1070
1078
  flex: '1',
1071
- marginRight: '.5em',
1072
1079
  width: '100%'
1073
1080
  }
1074
1081
  }), /*#__PURE__*/React__namespace.createElement(Select, {
@@ -1100,6 +1107,7 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React__namespace.forwardRef(funct
1100
1107
  } else {
1101
1108
  reactQuery.onlineManager.setOnline(false);
1102
1109
  setMockOffline(true);
1110
+ window.dispatchEvent(new Event('offline'));
1103
1111
  }
1104
1112
  },
1105
1113
  "aria-label": isMockOffline ? 'Restore offline mock' : 'Mock offline behavior',
@@ -1168,7 +1176,8 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React__namespace.forwardRef(funct
1168
1176
  }))), activeQueryHash && isOpen ? /*#__PURE__*/React__namespace.createElement(ActiveQuery, {
1169
1177
  activeQueryHash: activeQueryHash,
1170
1178
  queryCache: queryCache,
1171
- queryClient: client
1179
+ queryClient: client,
1180
+ errorTypes: errorTypes
1172
1181
  }) : null, showCloseButton ? /*#__PURE__*/React__namespace.createElement(Button, _extends({
1173
1182
  type: "button",
1174
1183
  "aria-controls": "ReactQueryDevtoolsPanel",
@@ -1185,26 +1194,67 @@ const ReactQueryDevtoolsPanel$1 = /*#__PURE__*/React__namespace.forwardRef(funct
1185
1194
  },
1186
1195
  onClick: e => {
1187
1196
  setIsOpen(false);
1188
- onCloseClick?.(e);
1197
+ onCloseClick == null ? void 0 : onCloseClick(e);
1189
1198
  }
1190
1199
  }), "Close") : null));
1191
1200
  });
1192
1201
  const ActiveQuery = ({
1193
1202
  queryCache,
1194
1203
  activeQueryHash,
1195
- queryClient
1204
+ queryClient,
1205
+ errorTypes
1196
1206
  }) => {
1207
+ var _useSubscribeToQueryC, _useSubscribeToQueryC2;
1197
1208
  const activeQuery = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash));
1198
- const activeQueryState = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.state);
1199
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.isStale()) ?? false;
1200
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.getAll().find(query => query.queryHash === activeQueryHash)?.getObserversCount()) ?? 0;
1209
+ const activeQueryState = useSubscribeToQueryCache(queryCache, () => {
1210
+ var _queryCache$getAll$fi;
1211
+ return (_queryCache$getAll$fi = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi.state;
1212
+ });
1213
+ const isStale = (_useSubscribeToQueryC = useSubscribeToQueryCache(queryCache, () => {
1214
+ var _queryCache$getAll$fi2;
1215
+ return (_queryCache$getAll$fi2 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi2.isStale();
1216
+ })) != null ? _useSubscribeToQueryC : false;
1217
+ const observerCount = (_useSubscribeToQueryC2 = useSubscribeToQueryCache(queryCache, () => {
1218
+ var _queryCache$getAll$fi3;
1219
+ return (_queryCache$getAll$fi3 = queryCache.getAll().find(query => query.queryHash === activeQueryHash)) == null ? void 0 : _queryCache$getAll$fi3.getObserversCount();
1220
+ })) != null ? _useSubscribeToQueryC2 : 0;
1201
1221
  const handleRefetch = () => {
1202
- const promise = activeQuery?.fetch();
1203
- promise?.catch(noop);
1222
+ const promise = activeQuery == null ? void 0 : activeQuery.fetch();
1223
+ promise == null ? void 0 : promise.catch(noop);
1204
1224
  };
1225
+ const currentErrorTypeName = React.useMemo(() => {
1226
+ if (activeQuery && activeQueryState != null && activeQueryState.error) {
1227
+ const errorType = errorTypes.find(type => {
1228
+ var _activeQueryState$err;
1229
+ return type.initializer(activeQuery).toString() === ((_activeQueryState$err = activeQueryState.error) == null ? void 0 : _activeQueryState$err.toString());
1230
+ });
1231
+ return errorType == null ? void 0 : errorType.name;
1232
+ }
1233
+ return undefined;
1234
+ }, [activeQuery, activeQueryState == null ? void 0 : activeQueryState.error, errorTypes]);
1205
1235
  if (!activeQuery || !activeQueryState) {
1206
1236
  return null;
1207
1237
  }
1238
+ const triggerError = errorType => {
1239
+ var _errorType$initialize;
1240
+ const error = (_errorType$initialize = errorType == null ? void 0 : errorType.initializer(activeQuery)) != null ? _errorType$initialize : new Error('Unknown error from devtools');
1241
+ const __previousQueryOptions = activeQuery.options;
1242
+ activeQuery.setState({
1243
+ status: 'error',
1244
+ error,
1245
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1246
+ fetchMeta: {
1247
+ ...activeQuery.state.fetchMeta,
1248
+ __previousQueryOptions
1249
+ }
1250
+ });
1251
+ };
1252
+ const restoreQueryAfterLoadingOrError = () => {
1253
+ activeQuery.fetch(activeQuery.state.fetchMeta.__previousQueryOptions, {
1254
+ // Make sure this fetch will cancel the previous one
1255
+ cancelRefetch: true
1256
+ });
1257
+ };
1208
1258
  return /*#__PURE__*/React__namespace.createElement(ActiveQueryPanel, null, /*#__PURE__*/React__namespace.createElement("div", {
1209
1259
  style: {
1210
1260
  padding: '.5em',
@@ -1221,7 +1271,7 @@ const ActiveQuery = ({
1221
1271
  style: {
1222
1272
  marginBottom: '.5em',
1223
1273
  display: 'flex',
1224
- alignItems: 'stretch',
1274
+ alignItems: 'flex-start',
1225
1275
  justifyContent: 'space-between'
1226
1276
  }
1227
1277
  }, /*#__PURE__*/React__namespace.createElement(Code, {
@@ -1271,7 +1321,11 @@ const ActiveQuery = ({
1271
1321
  }
1272
1322
  }, "Actions"), /*#__PURE__*/React__namespace.createElement("div", {
1273
1323
  style: {
1274
- padding: '0.5em'
1324
+ padding: '0.5em',
1325
+ display: 'flex',
1326
+ flexWrap: 'wrap',
1327
+ gap: '0.5em',
1328
+ alignItems: 'flex-end'
1275
1329
  }
1276
1330
  }, /*#__PURE__*/React__namespace.createElement(Button, {
1277
1331
  type: "button",
@@ -1299,7 +1353,65 @@ const ActiveQuery = ({
1299
1353
  style: {
1300
1354
  background: defaultTheme.danger
1301
1355
  }
1302
- }, "Remove")), /*#__PURE__*/React__namespace.createElement("div", {
1356
+ }, "Remove"), ' ', /*#__PURE__*/React__namespace.createElement(Button, {
1357
+ type: "button",
1358
+ onClick: () => {
1359
+ if (activeQuery.state.data === undefined) {
1360
+ restoreQueryAfterLoadingOrError();
1361
+ } else {
1362
+ const __previousQueryOptions = activeQuery.options;
1363
+ // Trigger a fetch in order to trigger suspense as well.
1364
+ activeQuery.fetch({
1365
+ ...__previousQueryOptions,
1366
+ queryFn: () => {
1367
+ return new Promise(() => {
1368
+ // Never resolve
1369
+ });
1370
+ },
1371
+ gcTime: -1
1372
+ });
1373
+ activeQuery.setState({
1374
+ data: undefined,
1375
+ status: 'pending',
1376
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
1377
+ fetchMeta: {
1378
+ ...activeQuery.state.fetchMeta,
1379
+ __previousQueryOptions
1380
+ }
1381
+ });
1382
+ }
1383
+ },
1384
+ style: {
1385
+ background: defaultTheme.paused
1386
+ }
1387
+ }, activeQuery.state.status === 'pending' ? 'Restore' : 'Trigger', ' ', "loading"), ' ', errorTypes.length === 0 || activeQuery.state.status === 'error' ? /*#__PURE__*/React__namespace.createElement(Button, {
1388
+ type: "button",
1389
+ onClick: () => {
1390
+ if (!activeQuery.state.error) {
1391
+ triggerError();
1392
+ } else {
1393
+ queryClient.resetQueries(activeQuery);
1394
+ }
1395
+ },
1396
+ style: {
1397
+ background: defaultTheme.danger
1398
+ }
1399
+ }, activeQuery.state.status === 'error' ? 'Restore' : 'Trigger', " error") : /*#__PURE__*/React__namespace.createElement("label", null, "Trigger error:", /*#__PURE__*/React__namespace.createElement(Select, {
1400
+ value: currentErrorTypeName != null ? currentErrorTypeName : '',
1401
+ style: {
1402
+ marginInlineStart: '.5em'
1403
+ },
1404
+ onChange: e => {
1405
+ const errorType = errorTypes.find(t => t.name === e.target.value);
1406
+ triggerError(errorType);
1407
+ }
1408
+ }, /*#__PURE__*/React__namespace.createElement("option", {
1409
+ key: "",
1410
+ value: ""
1411
+ }), errorTypes.map(errorType => /*#__PURE__*/React__namespace.createElement("option", {
1412
+ key: errorType.name,
1413
+ value: errorType.name
1414
+ }, errorType.name))))), /*#__PURE__*/React__namespace.createElement("div", {
1303
1415
  style: {
1304
1416
  background: defaultTheme.backgroundAlt,
1305
1417
  padding: '.5em',
@@ -1379,21 +1491,37 @@ const QueryRow = /*#__PURE__*/React__namespace.memo(({
1379
1491
  activeQueryHash,
1380
1492
  queryCache
1381
1493
  }) => {
1382
- const queryHash = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1383
- queryKey
1384
- })?.queryHash) ?? '';
1385
- const queryState = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1386
- queryKey
1387
- })?.state);
1388
- const isStale = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1389
- queryKey
1390
- })?.isStale()) ?? false;
1391
- const isDisabled = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1392
- queryKey
1393
- })?.isDisabled()) ?? false;
1394
- const observerCount = useSubscribeToQueryCache(queryCache, () => queryCache.find({
1395
- queryKey
1396
- })?.getObserversCount()) ?? 0;
1494
+ var _useSubscribeToQueryC3, _useSubscribeToQueryC4, _useSubscribeToQueryC5, _useSubscribeToQueryC6;
1495
+ const queryHash = (_useSubscribeToQueryC3 = useSubscribeToQueryCache(queryCache, () => {
1496
+ var _queryCache$find;
1497
+ return (_queryCache$find = queryCache.find({
1498
+ queryKey
1499
+ })) == null ? void 0 : _queryCache$find.queryHash;
1500
+ })) != null ? _useSubscribeToQueryC3 : '';
1501
+ const queryState = useSubscribeToQueryCache(queryCache, () => {
1502
+ var _queryCache$find2;
1503
+ return (_queryCache$find2 = queryCache.find({
1504
+ queryKey
1505
+ })) == null ? void 0 : _queryCache$find2.state;
1506
+ });
1507
+ const isStale = (_useSubscribeToQueryC4 = useSubscribeToQueryCache(queryCache, () => {
1508
+ var _queryCache$find3;
1509
+ return (_queryCache$find3 = queryCache.find({
1510
+ queryKey
1511
+ })) == null ? void 0 : _queryCache$find3.isStale();
1512
+ })) != null ? _useSubscribeToQueryC4 : false;
1513
+ const isDisabled = (_useSubscribeToQueryC5 = useSubscribeToQueryCache(queryCache, () => {
1514
+ var _queryCache$find4;
1515
+ return (_queryCache$find4 = queryCache.find({
1516
+ queryKey
1517
+ })) == null ? void 0 : _queryCache$find4.isDisabled();
1518
+ })) != null ? _useSubscribeToQueryC5 : false;
1519
+ const observerCount = (_useSubscribeToQueryC6 = useSubscribeToQueryCache(queryCache, () => {
1520
+ var _queryCache$find5;
1521
+ return (_queryCache$find5 = queryCache.find({
1522
+ queryKey
1523
+ })) == null ? void 0 : _queryCache$find5.getObserversCount();
1524
+ })) != null ? _useSubscribeToQueryC6 : 0;
1397
1525
  if (!queryState) {
1398
1526
  return null;
1399
1527
  }