reactjrx 1.40.0 → 1.41.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/dist/index.cjs +85 -66
- package/dist/index.d.ts +1 -1
- package/dist/index.js +86 -67
- package/dist/lib/queries/client/cache/registerResultInCache.d.ts +2 -2
- package/dist/lib/queries/client/createClient.d.ts +3 -3
- package/dist/lib/queries/client/invalidation/invalidationClient.d.ts +0 -1
- package/dist/lib/queries/client/refetch/client.d.ts +0 -1
- package/dist/lib/queries/client/store/createQueryStore.d.ts +1 -1
- package/dist/lib/queries/client/store/updateStoreWithNewQuery.d.ts +7 -0
- package/dist/lib/queries/client/types.d.ts +7 -0
- package/dist/lib/queries/react/Provider.d.ts +69 -2
- package/package.json +2 -2
- package/dist/lib/queries/client/fetch/mapWithComplete.d.ts +0 -4
- package/dist/lib/queries/client/store/updateStoreWithQuery.d.ts +0 -14
package/dist/index.cjs
CHANGED
|
@@ -242,7 +242,6 @@ const PersistSignals = react.memo(
|
|
|
242
242
|
).pipe(rxjs.map(() => true));
|
|
243
243
|
return stream.pipe(
|
|
244
244
|
rxjs.tap(() => {
|
|
245
|
-
console.log("hydration complete");
|
|
246
245
|
if (onReadyRef.current != null)
|
|
247
246
|
onReadyRef.current();
|
|
248
247
|
}),
|
|
@@ -598,27 +597,35 @@ function useAsyncQuery(query, mapOperatorOrOptions, options = {}) {
|
|
|
598
597
|
const Context = react.createContext({
|
|
599
598
|
client: null
|
|
600
599
|
});
|
|
600
|
+
const ClientEffect = ({
|
|
601
|
+
client
|
|
602
|
+
}) => {
|
|
603
|
+
react.useEffect(() => {
|
|
604
|
+
const destroy = client.start();
|
|
605
|
+
return () => {
|
|
606
|
+
destroy();
|
|
607
|
+
};
|
|
608
|
+
}, [client]);
|
|
609
|
+
return null;
|
|
610
|
+
};
|
|
601
611
|
const Provider = react.memo(
|
|
602
612
|
({
|
|
603
613
|
children,
|
|
604
614
|
client
|
|
605
615
|
}) => {
|
|
606
616
|
const value = react.useMemo(() => ({ client }), [client]);
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
[client]
|
|
612
|
-
);
|
|
613
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value, children });
|
|
617
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Context.Provider, { value, children: [
|
|
618
|
+
/* @__PURE__ */ jsxRuntime.jsx(ClientEffect, { client: value.client }),
|
|
619
|
+
children
|
|
620
|
+
] });
|
|
614
621
|
}
|
|
615
622
|
);
|
|
616
|
-
const
|
|
623
|
+
const useQueryClient = () => {
|
|
617
624
|
const context = react.useContext(Context);
|
|
618
625
|
if (context === null) {
|
|
619
626
|
throw new Error("You forgot to register the provider");
|
|
620
627
|
}
|
|
621
|
-
return
|
|
628
|
+
return context.client;
|
|
622
629
|
};
|
|
623
630
|
const arrayEqual = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
|
|
624
631
|
function isDefined(arg) {
|
|
@@ -678,7 +685,7 @@ function useQuery({
|
|
|
678
685
|
...options
|
|
679
686
|
}) {
|
|
680
687
|
const internalRefresh$ = useSubject();
|
|
681
|
-
const
|
|
688
|
+
const client = useQueryClient();
|
|
682
689
|
const params$ = useQueryParams({ queryFn, queryKey, ...options });
|
|
683
690
|
const result = useObserve(
|
|
684
691
|
() => {
|
|
@@ -856,7 +863,7 @@ function createLogger(env) {
|
|
|
856
863
|
};
|
|
857
864
|
return _logger;
|
|
858
865
|
}
|
|
859
|
-
const Logger = createLogger("
|
|
866
|
+
const Logger = createLogger("production");
|
|
860
867
|
const logger$3 = Logger.namespace("store");
|
|
861
868
|
const createDebugger = (store$) => {
|
|
862
869
|
return store$.pipe(
|
|
@@ -937,7 +944,12 @@ const createQueryStore = () => {
|
|
|
937
944
|
}));
|
|
938
945
|
};
|
|
939
946
|
};
|
|
940
|
-
const
|
|
947
|
+
const start = () => {
|
|
948
|
+
const debugger$ = createDebugger(store$);
|
|
949
|
+
return () => {
|
|
950
|
+
debugger$.unsubscribe();
|
|
951
|
+
};
|
|
952
|
+
};
|
|
941
953
|
return {
|
|
942
954
|
set: setValue,
|
|
943
955
|
get: getValue,
|
|
@@ -957,11 +969,7 @@ const createQueryStore = () => {
|
|
|
957
969
|
queryTriggerSubject.next(event);
|
|
958
970
|
},
|
|
959
971
|
size: () => store.size,
|
|
960
|
-
|
|
961
|
-
debugger$.unsubscribe();
|
|
962
|
-
queryEventSubject.complete();
|
|
963
|
-
queryTriggerSubject.complete();
|
|
964
|
-
}
|
|
972
|
+
start
|
|
965
973
|
};
|
|
966
974
|
};
|
|
967
975
|
const createQueryTrigger = ({
|
|
@@ -1053,17 +1061,17 @@ const registerResultInCache = ({
|
|
|
1053
1061
|
serializedKey,
|
|
1054
1062
|
options
|
|
1055
1063
|
}) => (stream) => stream.pipe(
|
|
1056
|
-
rxjs.tap((
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1064
|
+
rxjs.tap(({ data }) => {
|
|
1065
|
+
if (data == null ? void 0 : data.result) {
|
|
1066
|
+
const result = data == null ? void 0 : data.result;
|
|
1067
|
+
queryStore.update(serializedKey, {
|
|
1068
|
+
...options.cacheTime !== 0 && {
|
|
1069
|
+
cache_fnResult: { result }
|
|
1070
|
+
}
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1062
1073
|
})
|
|
1063
1074
|
);
|
|
1064
|
-
const mapWithComplete = (mapFn) => (stream) => {
|
|
1065
|
-
return stream.pipe(rxjs.map(mapFn({ isComplete: false })));
|
|
1066
|
-
};
|
|
1067
1075
|
const createQueryFetch = ({
|
|
1068
1076
|
options$,
|
|
1069
1077
|
options,
|
|
@@ -1097,12 +1105,8 @@ const createQueryFetch = ({
|
|
|
1097
1105
|
lastFetchedAt: (/* @__PURE__ */ new Date()).getTime()
|
|
1098
1106
|
});
|
|
1099
1107
|
}),
|
|
1100
|
-
|
|
1101
|
-
mapWithComplete(({ isComplete }) => (result) => ({
|
|
1108
|
+
rxjs.map((result) => ({
|
|
1102
1109
|
status: "success",
|
|
1103
|
-
...isComplete && {
|
|
1104
|
-
fetchStatus: "idle"
|
|
1105
|
-
},
|
|
1106
1110
|
data: { result },
|
|
1107
1111
|
error: void 0
|
|
1108
1112
|
})),
|
|
@@ -1121,7 +1125,8 @@ const createQueryFetch = ({
|
|
|
1121
1125
|
error
|
|
1122
1126
|
});
|
|
1123
1127
|
}),
|
|
1124
|
-
notifyQueryResult(options$)
|
|
1128
|
+
notifyQueryResult(options$),
|
|
1129
|
+
registerResultInCache({ serializedKey, options, queryStore })
|
|
1125
1130
|
);
|
|
1126
1131
|
const newCache$ = queryStore.queryEvent$.pipe(
|
|
1127
1132
|
rxjs.filter(
|
|
@@ -1189,6 +1194,12 @@ const compareKeys = (keyA, keyB, { exact = false } = {}) => {
|
|
|
1189
1194
|
return keyA.reduce((acc, value, index) => {
|
|
1190
1195
|
if (!acc)
|
|
1191
1196
|
return false;
|
|
1197
|
+
if (value === void 0) {
|
|
1198
|
+
const hasNextItemInLineNotUndefined = keyA.slice(index, keyA.length - 1).some((item) => item !== void 0);
|
|
1199
|
+
if (!hasNextItemInLineNotUndefined) {
|
|
1200
|
+
return true;
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1192
1203
|
return serializeObject(value) === serializeObject(keyB[index]);
|
|
1193
1204
|
}, true);
|
|
1194
1205
|
};
|
|
@@ -1232,9 +1243,7 @@ const createInvalidationClient = ({
|
|
|
1232
1243
|
});
|
|
1233
1244
|
};
|
|
1234
1245
|
return {
|
|
1235
|
-
invalidateQueries
|
|
1236
|
-
destroy: () => {
|
|
1237
|
-
}
|
|
1246
|
+
invalidateQueries
|
|
1238
1247
|
};
|
|
1239
1248
|
};
|
|
1240
1249
|
const logger$1 = Logger.namespace("refetch");
|
|
@@ -1289,9 +1298,7 @@ const createRefetchClient = ({
|
|
|
1289
1298
|
};
|
|
1290
1299
|
return {
|
|
1291
1300
|
pipeQueryResult,
|
|
1292
|
-
pipeQueryTrigger
|
|
1293
|
-
destroy: () => {
|
|
1294
|
-
}
|
|
1301
|
+
pipeQueryTrigger
|
|
1295
1302
|
};
|
|
1296
1303
|
};
|
|
1297
1304
|
const difference = (a, b) => a.filter((element) => !b.includes(element));
|
|
@@ -1309,11 +1316,9 @@ const createQueryListener = (store, onQuery) => store.store$.pipe(
|
|
|
1309
1316
|
);
|
|
1310
1317
|
return rxjs.merge(rxjs.NEVER, rxjs.of(key)).pipe(
|
|
1311
1318
|
rxjs.tap(() => {
|
|
1312
|
-
console.log("QUERY", key, "in");
|
|
1313
1319
|
}),
|
|
1314
1320
|
onQuery,
|
|
1315
1321
|
rxjs.finalize(() => {
|
|
1316
|
-
console.log("QUERY", key, "complete");
|
|
1317
1322
|
}),
|
|
1318
1323
|
rxjs.takeUntil(deleted$)
|
|
1319
1324
|
);
|
|
@@ -1459,13 +1464,15 @@ const getInitialQueryEntity = ({ key }) => ({
|
|
|
1459
1464
|
queryKey: key,
|
|
1460
1465
|
runners: []
|
|
1461
1466
|
});
|
|
1462
|
-
const
|
|
1467
|
+
const updateStoreWithNewQuery = ({
|
|
1463
1468
|
queryStore,
|
|
1464
1469
|
serializedKey,
|
|
1465
1470
|
runner$,
|
|
1471
|
+
options$,
|
|
1466
1472
|
key
|
|
1467
1473
|
}) => (stream) => stream.pipe(
|
|
1468
|
-
rxjs.
|
|
1474
|
+
rxjs.withLatestFrom(options$),
|
|
1475
|
+
rxjs.map(([value, options]) => {
|
|
1469
1476
|
if (key.length === 0)
|
|
1470
1477
|
return [value, () => {
|
|
1471
1478
|
}];
|
|
@@ -1474,7 +1481,7 @@ const updateStoreWithQuery = ({
|
|
|
1474
1481
|
} else {
|
|
1475
1482
|
queryStore.update(serializedKey, {
|
|
1476
1483
|
queryKey: key,
|
|
1477
|
-
...
|
|
1484
|
+
...options.markStale && {
|
|
1478
1485
|
isStale: true
|
|
1479
1486
|
}
|
|
1480
1487
|
});
|
|
@@ -1541,7 +1548,7 @@ const createClient = () => {
|
|
|
1541
1548
|
const serializedKey = serializeKey(key);
|
|
1542
1549
|
const internalRefetch$ = new rxjs.Subject();
|
|
1543
1550
|
const fn$ = maybeFn$ ?? (maybeFn ? rxjs.of(maybeFn) : rxjs.NEVER);
|
|
1544
|
-
|
|
1551
|
+
Logger.log("query$()", serializedKey);
|
|
1545
1552
|
const runner$ = options$.pipe(rxjs.map((options) => ({ options })));
|
|
1546
1553
|
let deleteRunner = () => {
|
|
1547
1554
|
};
|
|
@@ -1555,18 +1562,26 @@ const createClient = () => {
|
|
|
1555
1562
|
key: serializedKey,
|
|
1556
1563
|
queryStore
|
|
1557
1564
|
}).pipe(refetchClient.pipeQueryTrigger({ options$, key: serializedKey }));
|
|
1558
|
-
const result$ = rxjs.merge(
|
|
1565
|
+
const result$ = rxjs.merge(
|
|
1566
|
+
initialTrigger$.pipe(
|
|
1567
|
+
updateStoreWithNewQuery({
|
|
1568
|
+
key,
|
|
1569
|
+
queryStore,
|
|
1570
|
+
runner$,
|
|
1571
|
+
serializedKey,
|
|
1572
|
+
options$
|
|
1573
|
+
}),
|
|
1574
|
+
rxjs.map(([value, deleteRunnerFn]) => {
|
|
1575
|
+
deleteRunner = deleteRunnerFn;
|
|
1576
|
+
return value;
|
|
1577
|
+
})
|
|
1578
|
+
),
|
|
1579
|
+
trigger$
|
|
1580
|
+
).pipe(
|
|
1559
1581
|
rxjs.withLatestFrom(fn$, options$),
|
|
1560
1582
|
rxjs.map(([trigger2, fn, options]) => ({ trigger: trigger2, fn, options })),
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
queryStore,
|
|
1564
|
-
runner$,
|
|
1565
|
-
serializedKey
|
|
1566
|
-
}),
|
|
1567
|
-
rxjs.map(([value, deleteRunnerFn]) => {
|
|
1568
|
-
deleteRunner = deleteRunnerFn;
|
|
1569
|
-
console.log("reactjrx", serializedKey, "query trigger", {
|
|
1583
|
+
rxjs.map((value) => {
|
|
1584
|
+
Logger.log("reactjrx", serializedKey, "query trigger", {
|
|
1570
1585
|
trigger: value.trigger,
|
|
1571
1586
|
options: value.options
|
|
1572
1587
|
});
|
|
@@ -1604,9 +1619,6 @@ const createClient = () => {
|
|
|
1604
1619
|
return !shouldStop;
|
|
1605
1620
|
}, true),
|
|
1606
1621
|
rxjs.map(([result]) => result),
|
|
1607
|
-
rxjs.tap((result) => {
|
|
1608
|
-
console.log("result", result);
|
|
1609
|
-
}),
|
|
1610
1622
|
rxjs.finalize(() => {
|
|
1611
1623
|
deleteRunner();
|
|
1612
1624
|
})
|
|
@@ -1615,7 +1627,7 @@ const createClient = () => {
|
|
|
1615
1627
|
result$
|
|
1616
1628
|
};
|
|
1617
1629
|
};
|
|
1618
|
-
const
|
|
1630
|
+
const queryListener$ = createQueryListener(
|
|
1619
1631
|
queryStore,
|
|
1620
1632
|
(stream) => stream.pipe(
|
|
1621
1633
|
rxjs.switchMap((key) => {
|
|
@@ -1633,17 +1645,24 @@ const createClient = () => {
|
|
|
1633
1645
|
);
|
|
1634
1646
|
})
|
|
1635
1647
|
)
|
|
1636
|
-
)
|
|
1648
|
+
);
|
|
1649
|
+
const start = () => {
|
|
1650
|
+
const queryListenerSub = queryListener$.subscribe();
|
|
1651
|
+
const started = [queryStore.start()];
|
|
1652
|
+
return () => {
|
|
1653
|
+
started.forEach((destroy) => {
|
|
1654
|
+
destroy();
|
|
1655
|
+
});
|
|
1656
|
+
queryListenerSub.unsubscribe();
|
|
1657
|
+
};
|
|
1658
|
+
};
|
|
1637
1659
|
return {
|
|
1660
|
+
start,
|
|
1638
1661
|
query$,
|
|
1639
1662
|
queryStore,
|
|
1640
1663
|
...invalidationClient,
|
|
1641
1664
|
...cacheClient,
|
|
1642
|
-
...refetchClient
|
|
1643
|
-
destroy: () => {
|
|
1644
|
-
queryStore.destroy();
|
|
1645
|
-
queryListenerSub.unsubscribe();
|
|
1646
|
-
}
|
|
1665
|
+
...refetchClient
|
|
1647
1666
|
};
|
|
1648
1667
|
};
|
|
1649
1668
|
exports.PersistSignals = PersistSignals;
|
|
@@ -1663,7 +1682,7 @@ exports.useObserve = useObserve;
|
|
|
1663
1682
|
exports.useObserveCallback = useObserveCallback;
|
|
1664
1683
|
exports.usePersistSignalsContext = usePersistSignalsContext;
|
|
1665
1684
|
exports.useQuery = useQuery;
|
|
1666
|
-
exports.
|
|
1685
|
+
exports.useQueryClient = useQueryClient;
|
|
1667
1686
|
exports.useScopeSignals = useScopeSignals;
|
|
1668
1687
|
exports.useSetSignal = useSetSignal;
|
|
1669
1688
|
exports.useSignal = useSignal;
|
package/dist/index.d.ts
CHANGED
|
@@ -20,4 +20,4 @@ export * from "./lib/queries/react/useAsyncQuery";
|
|
|
20
20
|
export * from "./lib/queries/react/useQuery";
|
|
21
21
|
export * from "./lib/queries/react/useSubscribeEffect";
|
|
22
22
|
export * from "./lib/queries/client/createClient";
|
|
23
|
-
export { Provider as ReactjrxQueryProvider,
|
|
23
|
+
export { Provider as ReactjrxQueryProvider, useQueryClient } from "./lib/queries/react/Provider";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useRef, useMemo, useCallback, useSyncExternalStore, useEffect, createContext, memo, useContext } from "react";
|
|
2
2
|
import { distinctUntilChanged, tap, finalize, catchError, EMPTY, Subject, identity, BehaviorSubject, of, zip, from, map, merge, throttleTime, switchMap, defer, iif, timer, throwError, scan, take, startWith, combineLatest, first, takeUntil, filter, concatMap as concatMap$1, mergeMap, fromEvent, skip, withLatestFrom, retry, shareReplay, endWith, delay, share, pairwise, NEVER, takeWhile } from "rxjs";
|
|
3
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { retryWhen, concatMap, tap as tap$1 } from "rxjs/operators";
|
|
5
5
|
const useLiveRef = (value) => {
|
|
6
6
|
const ref = useRef(value);
|
|
@@ -240,7 +240,6 @@ const PersistSignals = memo(
|
|
|
240
240
|
).pipe(map(() => true));
|
|
241
241
|
return stream.pipe(
|
|
242
242
|
tap(() => {
|
|
243
|
-
console.log("hydration complete");
|
|
244
243
|
if (onReadyRef.current != null)
|
|
245
244
|
onReadyRef.current();
|
|
246
245
|
}),
|
|
@@ -596,27 +595,35 @@ function useAsyncQuery(query, mapOperatorOrOptions, options = {}) {
|
|
|
596
595
|
const Context = createContext({
|
|
597
596
|
client: null
|
|
598
597
|
});
|
|
598
|
+
const ClientEffect = ({
|
|
599
|
+
client
|
|
600
|
+
}) => {
|
|
601
|
+
useEffect(() => {
|
|
602
|
+
const destroy = client.start();
|
|
603
|
+
return () => {
|
|
604
|
+
destroy();
|
|
605
|
+
};
|
|
606
|
+
}, [client]);
|
|
607
|
+
return null;
|
|
608
|
+
};
|
|
599
609
|
const Provider = memo(
|
|
600
610
|
({
|
|
601
611
|
children,
|
|
602
612
|
client
|
|
603
613
|
}) => {
|
|
604
614
|
const value = useMemo(() => ({ client }), [client]);
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
[client]
|
|
610
|
-
);
|
|
611
|
-
return /* @__PURE__ */ jsx(Context.Provider, { value, children });
|
|
615
|
+
return /* @__PURE__ */ jsxs(Context.Provider, { value, children: [
|
|
616
|
+
/* @__PURE__ */ jsx(ClientEffect, { client: value.client }),
|
|
617
|
+
children
|
|
618
|
+
] });
|
|
612
619
|
}
|
|
613
620
|
);
|
|
614
|
-
const
|
|
621
|
+
const useQueryClient = () => {
|
|
615
622
|
const context = useContext(Context);
|
|
616
623
|
if (context === null) {
|
|
617
624
|
throw new Error("You forgot to register the provider");
|
|
618
625
|
}
|
|
619
|
-
return
|
|
626
|
+
return context.client;
|
|
620
627
|
};
|
|
621
628
|
const arrayEqual = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
|
|
622
629
|
function isDefined(arg) {
|
|
@@ -676,7 +683,7 @@ function useQuery({
|
|
|
676
683
|
...options
|
|
677
684
|
}) {
|
|
678
685
|
const internalRefresh$ = useSubject();
|
|
679
|
-
const
|
|
686
|
+
const client = useQueryClient();
|
|
680
687
|
const params$ = useQueryParams({ queryFn, queryKey, ...options });
|
|
681
688
|
const result = useObserve(
|
|
682
689
|
() => {
|
|
@@ -854,7 +861,7 @@ function createLogger(env) {
|
|
|
854
861
|
};
|
|
855
862
|
return _logger;
|
|
856
863
|
}
|
|
857
|
-
const Logger = createLogger("
|
|
864
|
+
const Logger = createLogger("production");
|
|
858
865
|
const logger$3 = Logger.namespace("store");
|
|
859
866
|
const createDebugger = (store$) => {
|
|
860
867
|
return store$.pipe(
|
|
@@ -935,7 +942,12 @@ const createQueryStore = () => {
|
|
|
935
942
|
}));
|
|
936
943
|
};
|
|
937
944
|
};
|
|
938
|
-
const
|
|
945
|
+
const start = () => {
|
|
946
|
+
const debugger$ = createDebugger(store$);
|
|
947
|
+
return () => {
|
|
948
|
+
debugger$.unsubscribe();
|
|
949
|
+
};
|
|
950
|
+
};
|
|
939
951
|
return {
|
|
940
952
|
set: setValue,
|
|
941
953
|
get: getValue,
|
|
@@ -955,11 +967,7 @@ const createQueryStore = () => {
|
|
|
955
967
|
queryTriggerSubject.next(event);
|
|
956
968
|
},
|
|
957
969
|
size: () => store.size,
|
|
958
|
-
|
|
959
|
-
debugger$.unsubscribe();
|
|
960
|
-
queryEventSubject.complete();
|
|
961
|
-
queryTriggerSubject.complete();
|
|
962
|
-
}
|
|
970
|
+
start
|
|
963
971
|
};
|
|
964
972
|
};
|
|
965
973
|
const createQueryTrigger = ({
|
|
@@ -1051,17 +1059,17 @@ const registerResultInCache = ({
|
|
|
1051
1059
|
serializedKey,
|
|
1052
1060
|
options
|
|
1053
1061
|
}) => (stream) => stream.pipe(
|
|
1054
|
-
tap((
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1062
|
+
tap(({ data }) => {
|
|
1063
|
+
if (data == null ? void 0 : data.result) {
|
|
1064
|
+
const result = data == null ? void 0 : data.result;
|
|
1065
|
+
queryStore.update(serializedKey, {
|
|
1066
|
+
...options.cacheTime !== 0 && {
|
|
1067
|
+
cache_fnResult: { result }
|
|
1068
|
+
}
|
|
1069
|
+
});
|
|
1070
|
+
}
|
|
1060
1071
|
})
|
|
1061
1072
|
);
|
|
1062
|
-
const mapWithComplete = (mapFn) => (stream) => {
|
|
1063
|
-
return stream.pipe(map(mapFn({ isComplete: false })));
|
|
1064
|
-
};
|
|
1065
1073
|
const createQueryFetch = ({
|
|
1066
1074
|
options$,
|
|
1067
1075
|
options,
|
|
@@ -1095,12 +1103,8 @@ const createQueryFetch = ({
|
|
|
1095
1103
|
lastFetchedAt: (/* @__PURE__ */ new Date()).getTime()
|
|
1096
1104
|
});
|
|
1097
1105
|
}),
|
|
1098
|
-
|
|
1099
|
-
mapWithComplete(({ isComplete }) => (result) => ({
|
|
1106
|
+
map((result) => ({
|
|
1100
1107
|
status: "success",
|
|
1101
|
-
...isComplete && {
|
|
1102
|
-
fetchStatus: "idle"
|
|
1103
|
-
},
|
|
1104
1108
|
data: { result },
|
|
1105
1109
|
error: void 0
|
|
1106
1110
|
})),
|
|
@@ -1119,7 +1123,8 @@ const createQueryFetch = ({
|
|
|
1119
1123
|
error
|
|
1120
1124
|
});
|
|
1121
1125
|
}),
|
|
1122
|
-
notifyQueryResult(options$)
|
|
1126
|
+
notifyQueryResult(options$),
|
|
1127
|
+
registerResultInCache({ serializedKey, options, queryStore })
|
|
1123
1128
|
);
|
|
1124
1129
|
const newCache$ = queryStore.queryEvent$.pipe(
|
|
1125
1130
|
filter(
|
|
@@ -1187,6 +1192,12 @@ const compareKeys = (keyA, keyB, { exact = false } = {}) => {
|
|
|
1187
1192
|
return keyA.reduce((acc, value, index) => {
|
|
1188
1193
|
if (!acc)
|
|
1189
1194
|
return false;
|
|
1195
|
+
if (value === void 0) {
|
|
1196
|
+
const hasNextItemInLineNotUndefined = keyA.slice(index, keyA.length - 1).some((item) => item !== void 0);
|
|
1197
|
+
if (!hasNextItemInLineNotUndefined) {
|
|
1198
|
+
return true;
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1190
1201
|
return serializeObject(value) === serializeObject(keyB[index]);
|
|
1191
1202
|
}, true);
|
|
1192
1203
|
};
|
|
@@ -1230,9 +1241,7 @@ const createInvalidationClient = ({
|
|
|
1230
1241
|
});
|
|
1231
1242
|
};
|
|
1232
1243
|
return {
|
|
1233
|
-
invalidateQueries
|
|
1234
|
-
destroy: () => {
|
|
1235
|
-
}
|
|
1244
|
+
invalidateQueries
|
|
1236
1245
|
};
|
|
1237
1246
|
};
|
|
1238
1247
|
const logger$1 = Logger.namespace("refetch");
|
|
@@ -1287,9 +1296,7 @@ const createRefetchClient = ({
|
|
|
1287
1296
|
};
|
|
1288
1297
|
return {
|
|
1289
1298
|
pipeQueryResult,
|
|
1290
|
-
pipeQueryTrigger
|
|
1291
|
-
destroy: () => {
|
|
1292
|
-
}
|
|
1299
|
+
pipeQueryTrigger
|
|
1293
1300
|
};
|
|
1294
1301
|
};
|
|
1295
1302
|
const difference = (a, b) => a.filter((element) => !b.includes(element));
|
|
@@ -1307,11 +1314,9 @@ const createQueryListener = (store, onQuery) => store.store$.pipe(
|
|
|
1307
1314
|
);
|
|
1308
1315
|
return merge(NEVER, of(key)).pipe(
|
|
1309
1316
|
tap(() => {
|
|
1310
|
-
console.log("QUERY", key, "in");
|
|
1311
1317
|
}),
|
|
1312
1318
|
onQuery,
|
|
1313
1319
|
finalize(() => {
|
|
1314
|
-
console.log("QUERY", key, "complete");
|
|
1315
1320
|
}),
|
|
1316
1321
|
takeUntil(deleted$)
|
|
1317
1322
|
);
|
|
@@ -1457,13 +1462,15 @@ const getInitialQueryEntity = ({ key }) => ({
|
|
|
1457
1462
|
queryKey: key,
|
|
1458
1463
|
runners: []
|
|
1459
1464
|
});
|
|
1460
|
-
const
|
|
1465
|
+
const updateStoreWithNewQuery = ({
|
|
1461
1466
|
queryStore,
|
|
1462
1467
|
serializedKey,
|
|
1463
1468
|
runner$,
|
|
1469
|
+
options$,
|
|
1464
1470
|
key
|
|
1465
1471
|
}) => (stream) => stream.pipe(
|
|
1466
|
-
|
|
1472
|
+
withLatestFrom(options$),
|
|
1473
|
+
map(([value, options]) => {
|
|
1467
1474
|
if (key.length === 0)
|
|
1468
1475
|
return [value, () => {
|
|
1469
1476
|
}];
|
|
@@ -1472,7 +1479,7 @@ const updateStoreWithQuery = ({
|
|
|
1472
1479
|
} else {
|
|
1473
1480
|
queryStore.update(serializedKey, {
|
|
1474
1481
|
queryKey: key,
|
|
1475
|
-
...
|
|
1482
|
+
...options.markStale && {
|
|
1476
1483
|
isStale: true
|
|
1477
1484
|
}
|
|
1478
1485
|
});
|
|
@@ -1539,7 +1546,7 @@ const createClient = () => {
|
|
|
1539
1546
|
const serializedKey = serializeKey(key);
|
|
1540
1547
|
const internalRefetch$ = new Subject();
|
|
1541
1548
|
const fn$ = maybeFn$ ?? (maybeFn ? of(maybeFn) : NEVER);
|
|
1542
|
-
|
|
1549
|
+
Logger.log("query$()", serializedKey);
|
|
1543
1550
|
const runner$ = options$.pipe(map((options) => ({ options })));
|
|
1544
1551
|
let deleteRunner = () => {
|
|
1545
1552
|
};
|
|
@@ -1553,18 +1560,26 @@ const createClient = () => {
|
|
|
1553
1560
|
key: serializedKey,
|
|
1554
1561
|
queryStore
|
|
1555
1562
|
}).pipe(refetchClient.pipeQueryTrigger({ options$, key: serializedKey }));
|
|
1556
|
-
const result$ = merge(
|
|
1563
|
+
const result$ = merge(
|
|
1564
|
+
initialTrigger$.pipe(
|
|
1565
|
+
updateStoreWithNewQuery({
|
|
1566
|
+
key,
|
|
1567
|
+
queryStore,
|
|
1568
|
+
runner$,
|
|
1569
|
+
serializedKey,
|
|
1570
|
+
options$
|
|
1571
|
+
}),
|
|
1572
|
+
map(([value, deleteRunnerFn]) => {
|
|
1573
|
+
deleteRunner = deleteRunnerFn;
|
|
1574
|
+
return value;
|
|
1575
|
+
})
|
|
1576
|
+
),
|
|
1577
|
+
trigger$
|
|
1578
|
+
).pipe(
|
|
1557
1579
|
withLatestFrom(fn$, options$),
|
|
1558
1580
|
map(([trigger2, fn, options]) => ({ trigger: trigger2, fn, options })),
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
queryStore,
|
|
1562
|
-
runner$,
|
|
1563
|
-
serializedKey
|
|
1564
|
-
}),
|
|
1565
|
-
map(([value, deleteRunnerFn]) => {
|
|
1566
|
-
deleteRunner = deleteRunnerFn;
|
|
1567
|
-
console.log("reactjrx", serializedKey, "query trigger", {
|
|
1581
|
+
map((value) => {
|
|
1582
|
+
Logger.log("reactjrx", serializedKey, "query trigger", {
|
|
1568
1583
|
trigger: value.trigger,
|
|
1569
1584
|
options: value.options
|
|
1570
1585
|
});
|
|
@@ -1602,9 +1617,6 @@ const createClient = () => {
|
|
|
1602
1617
|
return !shouldStop;
|
|
1603
1618
|
}, true),
|
|
1604
1619
|
map(([result]) => result),
|
|
1605
|
-
tap((result) => {
|
|
1606
|
-
console.log("result", result);
|
|
1607
|
-
}),
|
|
1608
1620
|
finalize(() => {
|
|
1609
1621
|
deleteRunner();
|
|
1610
1622
|
})
|
|
@@ -1613,7 +1625,7 @@ const createClient = () => {
|
|
|
1613
1625
|
result$
|
|
1614
1626
|
};
|
|
1615
1627
|
};
|
|
1616
|
-
const
|
|
1628
|
+
const queryListener$ = createQueryListener(
|
|
1617
1629
|
queryStore,
|
|
1618
1630
|
(stream) => stream.pipe(
|
|
1619
1631
|
switchMap((key) => {
|
|
@@ -1631,17 +1643,24 @@ const createClient = () => {
|
|
|
1631
1643
|
);
|
|
1632
1644
|
})
|
|
1633
1645
|
)
|
|
1634
|
-
)
|
|
1646
|
+
);
|
|
1647
|
+
const start = () => {
|
|
1648
|
+
const queryListenerSub = queryListener$.subscribe();
|
|
1649
|
+
const started = [queryStore.start()];
|
|
1650
|
+
return () => {
|
|
1651
|
+
started.forEach((destroy) => {
|
|
1652
|
+
destroy();
|
|
1653
|
+
});
|
|
1654
|
+
queryListenerSub.unsubscribe();
|
|
1655
|
+
};
|
|
1656
|
+
};
|
|
1635
1657
|
return {
|
|
1658
|
+
start,
|
|
1636
1659
|
query$,
|
|
1637
1660
|
queryStore,
|
|
1638
1661
|
...invalidationClient,
|
|
1639
1662
|
...cacheClient,
|
|
1640
|
-
...refetchClient
|
|
1641
|
-
destroy: () => {
|
|
1642
|
-
queryStore.destroy();
|
|
1643
|
-
queryListenerSub.unsubscribe();
|
|
1644
|
-
}
|
|
1663
|
+
...refetchClient
|
|
1645
1664
|
};
|
|
1646
1665
|
};
|
|
1647
1666
|
export {
|
|
@@ -1662,7 +1681,7 @@ export {
|
|
|
1662
1681
|
useObserveCallback,
|
|
1663
1682
|
usePersistSignalsContext,
|
|
1664
1683
|
useQuery,
|
|
1665
|
-
|
|
1684
|
+
useQueryClient,
|
|
1666
1685
|
useScopeSignals,
|
|
1667
1686
|
useSetSignal,
|
|
1668
1687
|
useSignal,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type MonoTypeOperatorFunction } from "rxjs";
|
|
2
2
|
import { type QueryStore } from "../store/createQueryStore";
|
|
3
|
-
import { type QueryOptions } from "../types";
|
|
3
|
+
import { type QueryResult, type QueryOptions } from "../types";
|
|
4
4
|
export declare const registerResultInCache: <T>({ queryStore, serializedKey, options }: {
|
|
5
5
|
queryStore: QueryStore;
|
|
6
6
|
serializedKey: string;
|
|
7
7
|
options: QueryOptions<T>;
|
|
8
|
-
}) => MonoTypeOperatorFunction<T
|
|
8
|
+
}) => MonoTypeOperatorFunction<Partial<QueryResult<T>>>;
|
|
@@ -2,7 +2,6 @@ import { type Observable, BehaviorSubject } from "rxjs";
|
|
|
2
2
|
import { type QueryOptions, type QueryFn, type QueryTrigger, type QueryResult } from "./types";
|
|
3
3
|
import { type QueryKey } from "./keys/types";
|
|
4
4
|
export declare const createClient: () => {
|
|
5
|
-
destroy: () => void;
|
|
6
5
|
pipeQueryResult: <R extends Partial<QueryResult<T>>, T>({ options$ }: {
|
|
7
6
|
key: string;
|
|
8
7
|
queryStore: {
|
|
@@ -22,7 +21,7 @@ export declare const createClient: () => {
|
|
|
22
21
|
queryTrigger$: Observable<import("./store/createQueryStore").QueryTriggerEvent>;
|
|
23
22
|
dispatchQueryTrigger: (event: import("./store/createQueryStore").QueryTriggerEvent) => void;
|
|
24
23
|
size: () => number;
|
|
25
|
-
|
|
24
|
+
start: () => () => void;
|
|
26
25
|
};
|
|
27
26
|
options$: Observable<QueryOptions<T>>;
|
|
28
27
|
refetch$: Observable<QueryTrigger>;
|
|
@@ -40,6 +39,7 @@ export declare const createClient: () => {
|
|
|
40
39
|
exact?: boolean | undefined;
|
|
41
40
|
predicate?: ((storeObject: import("./store/createQueryStore").StoreObject<unknown>) => boolean) | undefined;
|
|
42
41
|
}) => void;
|
|
42
|
+
start: () => () => void;
|
|
43
43
|
query$: <T_5>({ key, fn$: maybeFn$, fn: maybeFn, refetch$, options$ }: {
|
|
44
44
|
key: QueryKey;
|
|
45
45
|
fn?: QueryFn<T_5> | undefined;
|
|
@@ -68,6 +68,6 @@ export declare const createClient: () => {
|
|
|
68
68
|
queryTrigger$: Observable<import("./store/createQueryStore").QueryTriggerEvent>;
|
|
69
69
|
dispatchQueryTrigger: (event: import("./store/createQueryStore").QueryTriggerEvent) => void;
|
|
70
70
|
size: () => number;
|
|
71
|
-
|
|
71
|
+
start: () => () => void;
|
|
72
72
|
};
|
|
73
73
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type OperatorFunction, type Observable } from "rxjs";
|
|
2
|
+
import { type QueryPipelineParams, type QueryOptions } from "../types";
|
|
3
|
+
export declare const updateStoreWithNewQuery: <T, R>({ queryStore, serializedKey, runner$, options$, key }: QueryPipelineParams<R> & {
|
|
4
|
+
runner$: Observable<{
|
|
5
|
+
options: QueryOptions<R>;
|
|
6
|
+
}>;
|
|
7
|
+
}) => OperatorFunction<T, [T, () => void]>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Observable } from "rxjs";
|
|
2
2
|
import { type QueryKey } from "./keys/types";
|
|
3
|
+
import { type QueryStore } from "./store/createQueryStore";
|
|
3
4
|
export interface QueryResult<T> {
|
|
4
5
|
data: {
|
|
5
6
|
result: T;
|
|
@@ -19,6 +20,12 @@ export interface QueryCommand<T> {
|
|
|
19
20
|
options$?: Observable<QueryOptions<T>>;
|
|
20
21
|
}
|
|
21
22
|
export type QueryFn<T> = (() => Promise<T>) | (() => Observable<T>) | Observable<T>;
|
|
23
|
+
export interface QueryPipelineParams<R> {
|
|
24
|
+
queryStore: QueryStore;
|
|
25
|
+
serializedKey: string;
|
|
26
|
+
key: QueryKey;
|
|
27
|
+
options$: Observable<QueryOptions<R>>;
|
|
28
|
+
}
|
|
22
29
|
export interface QueryTrigger {
|
|
23
30
|
type: string;
|
|
24
31
|
ignoreStale: boolean;
|
|
@@ -7,6 +7,73 @@ export declare const Provider: import("react").MemoExoticComponent<({ children,
|
|
|
7
7
|
children: ReactNode;
|
|
8
8
|
client: ReturnType<typeof createClient>;
|
|
9
9
|
}) => import("react/jsx-runtime").JSX.Element>;
|
|
10
|
-
export declare const
|
|
11
|
-
|
|
10
|
+
export declare const useQueryClient: () => {
|
|
11
|
+
pipeQueryResult: <R extends Partial<import("../client/types").QueryResult<T>>, T>({ options$ }: {
|
|
12
|
+
key: string;
|
|
13
|
+
queryStore: {
|
|
14
|
+
set: (key: string, value: import("../client/store/createQueryStore").StoreObject<unknown>) => void;
|
|
15
|
+
get: <T_1>(serializedKey: string) => import("../client/store/createQueryStore").StoreObject<T_1> | undefined;
|
|
16
|
+
get$: (key: string) => import("rxjs").Observable<import("../client/store/createQueryStore").StoreObject<unknown>>;
|
|
17
|
+
delete: (key: string) => void;
|
|
18
|
+
update: <T_2>(key: string, value: Partial<import("../client/store/createQueryStore").StoreObject<T_2>> | ((value: import("../client/store/createQueryStore").StoreObject<T_2>) => import("../client/store/createQueryStore").StoreObject<T_2>)) => void;
|
|
19
|
+
keys: () => IterableIterator<string>;
|
|
20
|
+
updateMany: (value: Partial<import("../client/store/createQueryStore").StoreObject<unknown>>, predicate?: (storeObject: import("../client/store/createQueryStore").StoreObject<unknown>) => boolean) => void;
|
|
21
|
+
addRunner: <T_3>(key: string, stream: import("rxjs").Observable<{
|
|
22
|
+
options: import("../client/types").QueryOptions<T_3>;
|
|
23
|
+
}>) => () => void;
|
|
24
|
+
store$: import("rxjs").BehaviorSubject<Map<string, import("rxjs").BehaviorSubject<import("../client/store/createQueryStore").StoreObject<unknown>>>>;
|
|
25
|
+
queryEvent$: import("rxjs").Observable<import("../client/store/createQueryStore").QueryEvent>;
|
|
26
|
+
dispatchQueryEvent: (event: import("../client/store/createQueryStore").QueryEvent) => void;
|
|
27
|
+
queryTrigger$: import("rxjs").Observable<import("../client/store/createQueryStore").QueryTriggerEvent>;
|
|
28
|
+
dispatchQueryTrigger: (event: import("../client/store/createQueryStore").QueryTriggerEvent) => void;
|
|
29
|
+
size: () => number;
|
|
30
|
+
start: () => () => void;
|
|
31
|
+
};
|
|
32
|
+
options$: import("rxjs").Observable<import("../client/types").QueryOptions<T>>;
|
|
33
|
+
refetch$: import("rxjs").Observable<import("../client/types").QueryTrigger>;
|
|
34
|
+
}) => import("rxjs").MonoTypeOperatorFunction<R>;
|
|
35
|
+
pipeQueryTrigger: <T_4>({ key }: {
|
|
36
|
+
key: string;
|
|
37
|
+
options$: import("rxjs").Observable<import("../client/types").QueryOptions<T_4>>;
|
|
38
|
+
}) => import("rxjs").MonoTypeOperatorFunction<import("../client/types").QueryTrigger>;
|
|
39
|
+
setQueryData: ({ queryKey, updater }: {
|
|
40
|
+
queryKey: import("../client/keys/types").QueryKey;
|
|
41
|
+
updater: unknown;
|
|
42
|
+
}) => void;
|
|
43
|
+
invalidateQueries: ({ queryKey, exact, predicate }?: {
|
|
44
|
+
queryKey?: import("../client/keys/types").QueryKey | undefined;
|
|
45
|
+
exact?: boolean | undefined;
|
|
46
|
+
predicate?: ((storeObject: import("../client/store/createQueryStore").StoreObject<unknown>) => boolean) | undefined;
|
|
47
|
+
}) => void;
|
|
48
|
+
start: () => () => void;
|
|
49
|
+
query$: <T_5>({ key, fn$: maybeFn$, fn: maybeFn, refetch$, options$ }: {
|
|
50
|
+
key: import("../client/keys/types").QueryKey;
|
|
51
|
+
fn?: import("../client/types").QueryFn<T_5> | undefined;
|
|
52
|
+
fn$?: import("rxjs").Observable<import("../client/types").QueryFn<T_5>> | undefined;
|
|
53
|
+
refetch$?: import("rxjs").Observable<{
|
|
54
|
+
ignoreStale: boolean;
|
|
55
|
+
}> | undefined;
|
|
56
|
+
options$?: import("rxjs").Observable<import("../client/types").QueryOptions<T_5>> | undefined;
|
|
57
|
+
}) => {
|
|
58
|
+
result$: import("rxjs").Observable<import("../client/types").QueryResult<T_5>>;
|
|
59
|
+
};
|
|
60
|
+
queryStore: {
|
|
61
|
+
set: (key: string, value: import("../client/store/createQueryStore").StoreObject<unknown>) => void;
|
|
62
|
+
get: <T_1>(serializedKey: string) => import("../client/store/createQueryStore").StoreObject<T_1> | undefined;
|
|
63
|
+
get$: (key: string) => import("rxjs").Observable<import("../client/store/createQueryStore").StoreObject<unknown>>;
|
|
64
|
+
delete: (key: string) => void;
|
|
65
|
+
update: <T_2>(key: string, value: Partial<import("../client/store/createQueryStore").StoreObject<T_2>> | ((value: import("../client/store/createQueryStore").StoreObject<T_2>) => import("../client/store/createQueryStore").StoreObject<T_2>)) => void;
|
|
66
|
+
keys: () => IterableIterator<string>;
|
|
67
|
+
updateMany: (value: Partial<import("../client/store/createQueryStore").StoreObject<unknown>>, predicate?: (storeObject: import("../client/store/createQueryStore").StoreObject<unknown>) => boolean) => void;
|
|
68
|
+
addRunner: <T_3>(key: string, stream: import("rxjs").Observable<{
|
|
69
|
+
options: import("../client/types").QueryOptions<T_3>;
|
|
70
|
+
}>) => () => void;
|
|
71
|
+
store$: import("rxjs").BehaviorSubject<Map<string, import("rxjs").BehaviorSubject<import("../client/store/createQueryStore").StoreObject<unknown>>>>;
|
|
72
|
+
queryEvent$: import("rxjs").Observable<import("../client/store/createQueryStore").QueryEvent>;
|
|
73
|
+
dispatchQueryEvent: (event: import("../client/store/createQueryStore").QueryEvent) => void;
|
|
74
|
+
queryTrigger$: import("rxjs").Observable<import("../client/store/createQueryStore").QueryTriggerEvent>;
|
|
75
|
+
dispatchQueryTrigger: (event: import("../client/store/createQueryStore").QueryTriggerEvent) => void;
|
|
76
|
+
size: () => number;
|
|
77
|
+
start: () => () => void;
|
|
78
|
+
};
|
|
12
79
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reactjrx",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.41.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@types/react-dom": "^18.0.11",
|
|
42
42
|
"@typescript-eslint/eslint-plugin": "^5.59.0",
|
|
43
43
|
"@vitejs/plugin-react": "^4.0.0",
|
|
44
|
-
"eslint": "^8.
|
|
44
|
+
"eslint": "^8.47.0",
|
|
45
45
|
"eslint-config-prettier": "^8.8.0",
|
|
46
46
|
"eslint-config-standard-with-typescript": "^34.0.1",
|
|
47
47
|
"eslint-plugin-import": "^2.27.5",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type OperatorFunction, type Observable } from "rxjs";
|
|
2
|
-
import { type QueryStore } from "./createQueryStore";
|
|
3
|
-
import { type QueryOptions } from "../types";
|
|
4
|
-
import { type QueryKey } from "../keys/types";
|
|
5
|
-
export declare const updateStoreWithQuery: <T extends {
|
|
6
|
-
options: QueryOptions<R>;
|
|
7
|
-
}, R>({ queryStore, serializedKey, runner$, key }: {
|
|
8
|
-
queryStore: QueryStore;
|
|
9
|
-
serializedKey: string;
|
|
10
|
-
key: QueryKey;
|
|
11
|
-
runner$: Observable<{
|
|
12
|
-
options: QueryOptions<R>;
|
|
13
|
-
}>;
|
|
14
|
-
}) => OperatorFunction<T, [T, () => void]>;
|