@confect/react 10.5.0 → 10.6.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/CHANGELOG.md +4 -0
- package/dist/OptimisticLocalStore.d.ts.map +1 -1
- package/dist/OptimisticLocalStore.js +3 -3
- package/dist/OptimisticLocalStore.js.map +1 -1
- package/dist/PaginatedQueryResult.d.ts.map +1 -1
- package/dist/PaginatedQueryResult.js +2 -3
- package/dist/QueryResult.d.ts.map +1 -1
- package/dist/QueryResult.js +2 -3
- package/dist/StreamPagination.d.ts.map +1 -1
- package/dist/StreamPagination.js +3 -4
- package/dist/_virtual/_rolldown/runtime.js +5 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -10
- package/dist/index.js.map +1 -1
- package/package.json +13 -13
- package/src/OptimisticLocalStore.ts +6 -4
- package/src/index.ts +25 -11
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptimisticLocalStore.d.ts","
|
|
1
|
+
{"version":3,"file":"OptimisticLocalStore.d.ts","sources":["../src/OptimisticLocalStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,KAAK,EAAE,oBAAoB,IAAI,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,SAAS,GAAG,CAAC,cAAc,EACvC,QAAQ,EAAE,KAAK,EACf,GAAG,IAAI,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAErC,aAAa,CAAC,KAAK,SAAS,GAAG,CAAC,cAAc,EAC5C,QAAQ,EAAE,KAAK,GACd,KAAK,CAAC;QACP,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;KAC1C,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,SAAS,GAAG,CAAC,cAAc,EACvC,QAAQ,EAAE,KAAK,EACf,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GACvC,IAAI,CAAC;CACT;AAED;;;GAGG;AACH,eAAO,MAAM,IAAI,qBACG,0BAA0B,KAC3C,oBAgCD,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { Ref } from "@confect/core";
|
|
3
|
+
import * as Arr from "effect/Array";
|
|
3
4
|
import * as Option from "effect/Option";
|
|
4
|
-
|
|
5
|
+
// src/OptimisticLocalStore.ts
|
|
5
6
|
var OptimisticLocalStore_exports = /* @__PURE__ */ __exportAll({ make: () => make });
|
|
6
7
|
/**
|
|
7
8
|
* Wraps Convex's `OptimisticLocalStore` so that it accepts Confect query `Ref`s
|
|
@@ -17,7 +18,7 @@ const make = (convexLocalStore) => ({
|
|
|
17
18
|
},
|
|
18
19
|
getAllQueries: (queryRef) => {
|
|
19
20
|
const functionReference = Ref.getFunctionReference(queryRef);
|
|
20
|
-
return convexLocalStore.getAllQueries(functionReference)
|
|
21
|
+
return Arr.map(convexLocalStore.getAllQueries(functionReference), ({ args, value }) => ({
|
|
21
22
|
args: Ref.decodeArgsSync(queryRef, args),
|
|
22
23
|
value: value === void 0 ? Option.none() : Option.some(Ref.decodeReturnsSync(queryRef, value))
|
|
23
24
|
}));
|
|
@@ -32,7 +33,6 @@ const make = (convexLocalStore) => ({
|
|
|
32
33
|
convexLocalStore.setQuery(functionReference, encodedArgs, encodedValue);
|
|
33
34
|
}
|
|
34
35
|
});
|
|
35
|
-
//#endregion
|
|
36
36
|
export { OptimisticLocalStore_exports, make };
|
|
37
37
|
|
|
38
38
|
//# sourceMappingURL=OptimisticLocalStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptimisticLocalStore.js","names":[],"sources":["../src/OptimisticLocalStore.ts"],"sourcesContent":["import { Ref } from \"@confect/core\";\nimport type { OptimisticLocalStore as ConvexOptimisticLocalStore } from \"convex/browser\";\nimport * as Option from \"effect/Option\";\n\n/**\n * The Confect counterpart to Convex's `OptimisticLocalStore`.\n *\n * Its methods accept Confect query `Ref`s and operate on decoded (Effect\n * Schema) values rather than the encoded values stored by Convex. Query values\n * are wrapped in `Option`: `Option.none()` represents a query that is not\n * present in the store, and `Option.some(value)` carries the decoded value.\n */\nexport interface OptimisticLocalStore {\n getQuery<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n ...args: Ref.OptionalArgs<Query>\n ): Option.Option<Ref.Returns<Query>>;\n\n getAllQueries<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n ): Array<{\n args: Ref.Args<Query>;\n value: Option.Option<Ref.Returns<Query>>;\n }>;\n\n setQuery<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n args: Ref.Args<Query>,\n value: Option.Option<Ref.Returns<Query>>,\n ): void;\n}\n\n/**\n * Wraps Convex's `OptimisticLocalStore` so that it accepts Confect query `Ref`s\n * and decoded values, handling the encoding/decoding against Convex's store.\n */\nexport const make = (\n convexLocalStore: ConvexOptimisticLocalStore,\n): OptimisticLocalStore => ({\n getQuery: (queryRef, ...rest) => {\n const functionReference = Ref.getFunctionReference(queryRef);\n const args = (rest[0] ?? {}) as Ref.Args<typeof queryRef>;\n const encodedArgs = Ref.encodeArgsSync(queryRef, args);\n const encoded = convexLocalStore.getQuery(functionReference, encodedArgs);\n return encoded === undefined\n ? Option.none()\n : Option.some(Ref.decodeReturnsSync(queryRef, encoded));\n },\n getAllQueries: (queryRef) => {\n const functionReference = Ref.getFunctionReference(queryRef);\n return
|
|
1
|
+
{"version":3,"file":"OptimisticLocalStore.js","names":[],"sources":["../src/OptimisticLocalStore.ts"],"sourcesContent":["import { Ref } from \"@confect/core\";\nimport type { OptimisticLocalStore as ConvexOptimisticLocalStore } from \"convex/browser\";\nimport * as Option from \"effect/Option\";\nimport * as Arr from \"effect/Array\";\n\n/**\n * The Confect counterpart to Convex's `OptimisticLocalStore`.\n *\n * Its methods accept Confect query `Ref`s and operate on decoded (Effect\n * Schema) values rather than the encoded values stored by Convex. Query values\n * are wrapped in `Option`: `Option.none()` represents a query that is not\n * present in the store, and `Option.some(value)` carries the decoded value.\n */\nexport interface OptimisticLocalStore {\n getQuery<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n ...args: Ref.OptionalArgs<Query>\n ): Option.Option<Ref.Returns<Query>>;\n\n getAllQueries<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n ): Array<{\n args: Ref.Args<Query>;\n value: Option.Option<Ref.Returns<Query>>;\n }>;\n\n setQuery<Query extends Ref.AnyPublicQuery>(\n queryRef: Query,\n args: Ref.Args<Query>,\n value: Option.Option<Ref.Returns<Query>>,\n ): void;\n}\n\n/**\n * Wraps Convex's `OptimisticLocalStore` so that it accepts Confect query `Ref`s\n * and decoded values, handling the encoding/decoding against Convex's store.\n */\nexport const make = (\n convexLocalStore: ConvexOptimisticLocalStore,\n): OptimisticLocalStore => ({\n getQuery: (queryRef, ...rest) => {\n const functionReference = Ref.getFunctionReference(queryRef);\n const args = (rest[0] ?? {}) as Ref.Args<typeof queryRef>;\n const encodedArgs = Ref.encodeArgsSync(queryRef, args);\n const encoded = convexLocalStore.getQuery(functionReference, encodedArgs);\n return encoded === undefined\n ? Option.none()\n : Option.some(Ref.decodeReturnsSync(queryRef, encoded));\n },\n getAllQueries: (queryRef) => {\n const functionReference = Ref.getFunctionReference(queryRef);\n return Arr.map(\n convexLocalStore.getAllQueries(functionReference),\n ({ args, value }) => ({\n args: Ref.decodeArgsSync(queryRef, args),\n value:\n value === undefined\n ? Option.none()\n : Option.some(Ref.decodeReturnsSync(queryRef, value)),\n }),\n );\n },\n setQuery: (queryRef, args, value) => {\n const functionReference = Ref.getFunctionReference(queryRef);\n const encodedArgs = Ref.encodeArgsSync(queryRef, args);\n const encodedValue = Option.match(value, {\n onNone: () => undefined,\n onSome: (decoded) => Ref.encodeReturnsSync(queryRef, decoded),\n });\n convexLocalStore.setQuery(functionReference, encodedArgs, encodedValue);\n },\n});\n"],"mappings":";;;;;;;;;;AAqCA,MAAa,QACX,sBAC0B;CAC1B,WAAW,UAAU,GAAG,SAAS;EAC/B,MAAM,oBAAoB,IAAI,qBAAqB,QAAQ;EAC3D,MAAM,OAAQ,KAAK,MAAM,CAAC;EAC1B,MAAM,cAAc,IAAI,eAAe,UAAU,IAAI;EACrD,MAAM,UAAU,iBAAiB,SAAS,mBAAmB,WAAW;EACxE,OAAO,YAAY,KAAA,IACf,OAAO,KAAK,IACZ,OAAO,KAAK,IAAI,kBAAkB,UAAU,OAAO,CAAC;CAC1D;CACA,gBAAgB,aAAa;EAC3B,MAAM,oBAAoB,IAAI,qBAAqB,QAAQ;EAC3D,OAAO,IAAI,IACT,iBAAiB,cAAc,iBAAiB,IAC/C,EAAE,MAAM,aAAa;GACpB,MAAM,IAAI,eAAe,UAAU,IAAI;GACvC,OACE,UAAU,KAAA,IACN,OAAO,KAAK,IACZ,OAAO,KAAK,IAAI,kBAAkB,UAAU,KAAK,CAAC;EAC1D,EACF;CACF;CACA,WAAW,UAAU,MAAM,UAAU;EACnC,MAAM,oBAAoB,IAAI,qBAAqB,QAAQ;EAC3D,MAAM,cAAc,IAAI,eAAe,UAAU,IAAI;EACrD,MAAM,eAAe,OAAO,MAAM,OAAO;GACvC,cAAc,KAAA;GACd,SAAS,YAAY,IAAI,kBAAkB,UAAU,OAAO;EAC9D,CAAC;EACD,iBAAiB,SAAS,mBAAmB,aAAa,YAAY;CACxE;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaginatedQueryResult.d.ts","
|
|
1
|
+
{"version":3,"file":"PaginatedQueryResult.d.ts","sources":["../src/PaginatedQueryResult.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import * as Function from "effect/Function";
|
|
2
3
|
import * as Match from "effect/Match";
|
|
3
4
|
import * as Equal from "effect/Equal";
|
|
4
|
-
import * as Function from "effect/Function";
|
|
5
5
|
import * as Hash from "effect/Hash";
|
|
6
6
|
import * as Pipeable from "effect/Pipeable";
|
|
7
7
|
import * as Predicate from "effect/Predicate";
|
|
8
|
-
|
|
8
|
+
// src/PaginatedQueryResult.ts
|
|
9
9
|
var PaginatedQueryResult_exports = /* @__PURE__ */ __exportAll({
|
|
10
10
|
canLoadMore: () => canLoadMore,
|
|
11
11
|
exhausted: () => exhausted,
|
|
@@ -85,7 +85,6 @@ const match = Function.dual(2, (self, options) => Match.value(self).pipe(Match.t
|
|
|
85
85
|
if (Predicate.hasProperty(options, "onFailure")) return options.onFailure(failure_.error, failure_.results);
|
|
86
86
|
throw new Error("`onFailure` is required when error schema is provided");
|
|
87
87
|
}), Match.exhaustive));
|
|
88
|
-
//#endregion
|
|
89
88
|
export { PaginatedQueryResult_exports, canLoadMore, exhausted, failure, isCanLoadMore, isExhausted, isFailure, isLoading, isLoadingFirstPage, isLoadingMore, isPaginatedQueryResult, loadingFirstPage, loadingMore, match };
|
|
90
89
|
|
|
91
90
|
//# sourceMappingURL=PaginatedQueryResult.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryResult.d.ts","
|
|
1
|
+
{"version":3,"file":"QueryResult.d.ts","sources":["../src/QueryResult.ts"],"names":[],"mappings":"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"}
|
package/dist/QueryResult.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import * as Function from "effect/Function";
|
|
2
3
|
import * as Match from "effect/Match";
|
|
3
4
|
import * as Equal from "effect/Equal";
|
|
4
|
-
import * as Function from "effect/Function";
|
|
5
5
|
import * as Hash from "effect/Hash";
|
|
6
6
|
import * as Pipeable from "effect/Pipeable";
|
|
7
7
|
import * as Predicate from "effect/Predicate";
|
|
8
|
-
|
|
8
|
+
// src/QueryResult.ts
|
|
9
9
|
var QueryResult_exports = /* @__PURE__ */ __exportAll({
|
|
10
10
|
fail: () => fail,
|
|
11
11
|
isFailure: () => isFailure,
|
|
@@ -63,7 +63,6 @@ const match = Function.dual(2, (self, options) => Match.value(self).pipe(Match.t
|
|
|
63
63
|
if (Predicate.hasProperty(options, "onFailure")) return options.onFailure(failure.error);
|
|
64
64
|
throw new Error("`onFailure` is required when error schema is provided");
|
|
65
65
|
}), Match.exhaustive));
|
|
66
|
-
//#endregion
|
|
67
66
|
export { QueryResult_exports, fail, isFailure, isLoading, isQueryResult, isSuccess, load, match, succeed };
|
|
68
67
|
|
|
69
68
|
//# sourceMappingURL=QueryResult.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamPagination.d.ts","
|
|
1
|
+
{"version":3,"file":"StreamPagination.d.ts","sources":["../src/StreamPagination.ts"],"names":[],"mappings":"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"}
|
package/dist/StreamPagination.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { __exportAll } from "./_virtual/_rolldown/runtime.js";
|
|
2
|
-
import * as Option from "effect/Option";
|
|
3
|
-
import { pipe } from "effect/Function";
|
|
4
2
|
import * as Array from "effect/Array";
|
|
3
|
+
import { pipe } from "effect/Function";
|
|
4
|
+
import * as Option from "effect/Option";
|
|
5
5
|
import * as Record from "effect/Record";
|
|
6
|
-
|
|
6
|
+
// src/StreamPagination.ts
|
|
7
7
|
var StreamPagination_exports = /* @__PURE__ */ __exportAll({
|
|
8
8
|
completeSplit: () => completeSplit,
|
|
9
9
|
empty: () => empty,
|
|
@@ -176,7 +176,6 @@ const interpret = (state, results, options) => {
|
|
|
176
176
|
});
|
|
177
177
|
return go(state.pageKeys, [], [], Option.none());
|
|
178
178
|
};
|
|
179
|
-
//#endregion
|
|
180
179
|
export { StreamPagination_exports, completeSplit, empty, initial, interpret, isLastPageSplitting, loadMore, pageRequests, pin, split };
|
|
181
180
|
|
|
182
181
|
//# sourceMappingURL=StreamPagination.js.map
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
// \0rolldown/runtime.js
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
-
var __exportAll = (all,
|
|
4
|
-
let target = {};
|
|
3
|
+
var __exportAll = (all, flags) => {
|
|
4
|
+
let target = Object.setPrototypeOf({}, null);
|
|
5
5
|
for (var name in all) __defProp(target, name, {
|
|
6
6
|
get: all[name],
|
|
7
7
|
enumerable: true
|
|
8
8
|
});
|
|
9
|
-
if (!
|
|
10
|
-
return target;
|
|
9
|
+
if (!(flags & 1)) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
+
return flags & 2 ? target : Object.preventExtensions(target);
|
|
11
11
|
};
|
|
12
|
-
//#endregion
|
|
13
12
|
export { __exportAll };
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,13 +9,18 @@ import { useAction as useAction$1, useMutation as useMutation$1, useQueries, use
|
|
|
9
9
|
import { getFunctionName } from "convex/server";
|
|
10
10
|
import { ConvexError, convexToJson } from "convex/values";
|
|
11
11
|
import * as Cause from "effect/Cause";
|
|
12
|
+
import * as Array from "effect/Array";
|
|
13
|
+
import * as String from "effect/String";
|
|
14
|
+
import * as Schema from "effect/Schema";
|
|
15
|
+
import { pipe } from "effect/Function";
|
|
12
16
|
import * as Effect from "effect/Effect";
|
|
13
17
|
import * as Result from "effect/Result";
|
|
14
18
|
import * as Exit from "effect/Exit";
|
|
15
19
|
import * as Match from "effect/Match";
|
|
16
20
|
import * as Option from "effect/Option";
|
|
17
21
|
import { useCallback, useMemo, useState } from "react";
|
|
18
|
-
|
|
22
|
+
// src/index.ts
|
|
23
|
+
const encodeJson = Schema.Unknown.pipe(Schema.fromJsonString, Schema.encodeResult);
|
|
19
24
|
const useQuery = (ref, ...rest) => {
|
|
20
25
|
const functionReference = Ref.getFunctionReference(ref);
|
|
21
26
|
const args = rest[0];
|
|
@@ -51,9 +56,9 @@ const MINIMUM_CONVEX_VERSION = "1.36.0";
|
|
|
51
56
|
* version is the only reliable signal.
|
|
52
57
|
*/
|
|
53
58
|
const supportsErrorsAsValues = (() => {
|
|
54
|
-
const [major, minor] = version.split(".").map(Number);
|
|
59
|
+
const [major, minor] = pipe(version, String.split("."), Array.map(Number));
|
|
55
60
|
if (major === void 0 || minor === void 0 || Number.isNaN(major) || Number.isNaN(minor)) return false;
|
|
56
|
-
const [minimumMajor, minimumMinor] = MINIMUM_CONVEX_VERSION.split(".").map(Number);
|
|
61
|
+
const [minimumMajor, minimumMinor] = pipe(MINIMUM_CONVEX_VERSION, String.split("."), Array.map(Number));
|
|
57
62
|
return major > minimumMajor || major === minimumMajor && minor >= minimumMinor;
|
|
58
63
|
})();
|
|
59
64
|
/**
|
|
@@ -108,7 +113,7 @@ const usePaginatedQuery = (ref, args, options) => {
|
|
|
108
113
|
* query (a data-dependent query changed underneath us), calling for a full
|
|
109
114
|
* pagination reset rather than a failure.
|
|
110
115
|
*/
|
|
111
|
-
const isInvalidCursorError = (error) => error.message.includes("InvalidCursor") || error instanceof ConvexError && typeof error.data === "object" && error.data !== null && error.data.paginationError === "InvalidCursor";
|
|
116
|
+
const isInvalidCursorError = (error) => pipe(error.message, String.includes("InvalidCursor")) || error instanceof ConvexError && typeof error.data === "object" && error.data !== null && error.data.paginationError === "InvalidCursor";
|
|
112
117
|
const NO_ITEMS = [];
|
|
113
118
|
/**
|
|
114
119
|
* EXPERIMENTAL—endCursor-pinned reactive pagination (see
|
|
@@ -131,15 +136,15 @@ const useStreamPaginatedQuery = (ref, args, options) => {
|
|
|
131
136
|
const functionReference = useMemo(() => Ref.getFunctionReference(ref), [ref]);
|
|
132
137
|
const skipped = args === "skip";
|
|
133
138
|
const rawEncodedArgs = args === "skip" ? void 0 : Ref.encodePaginatedQueryArgsSync(ref, args);
|
|
134
|
-
const encodedArgsKey = rawEncodedArgs === void 0 ? "skip" :
|
|
139
|
+
const encodedArgsKey = rawEncodedArgs === void 0 ? "skip" : encodeJson(convexToJson(rawEncodedArgs)).pipe(Result.getOrThrow);
|
|
135
140
|
const encodedArgs = useMemo(() => rawEncodedArgs, [ref, encodedArgsKey]);
|
|
136
|
-
const resetKey = useMemo(() =>
|
|
141
|
+
const resetKey = useMemo(() => encodeJson([
|
|
137
142
|
getFunctionName(functionReference),
|
|
138
143
|
encodedArgsKey,
|
|
139
144
|
options.initialNumItems,
|
|
140
145
|
options.maximumRowsRead ?? null,
|
|
141
146
|
options.maximumBytesRead ?? null
|
|
142
|
-
]), [
|
|
147
|
+
]).pipe(Result.getOrThrow), [
|
|
143
148
|
functionReference,
|
|
144
149
|
encodedArgsKey,
|
|
145
150
|
options.initialNumItems,
|
|
@@ -161,7 +166,7 @@ const useStreamPaginatedQuery = (ref, args, options) => {
|
|
|
161
166
|
}
|
|
162
167
|
const applyTransitions = useCallback((transitions) => setTracked((previous) => ({
|
|
163
168
|
resetKey: previous.resetKey,
|
|
164
|
-
state:
|
|
169
|
+
state: Array.reduce(transitions, previous.state, (state, transition) => transition(state))
|
|
165
170
|
})), []);
|
|
166
171
|
const queries = useMemo(() => pageRequests(current.state, (page) => ({
|
|
167
172
|
query: functionReference,
|
|
@@ -190,7 +195,7 @@ const useStreamPaginatedQuery = (ref, args, options) => {
|
|
|
190
195
|
else if (interpretation._tag === "Interpreted" && interpretation.transitions.length > 0) applyTransitions(interpretation.transitions);
|
|
191
196
|
const encodedItems = interpretation._tag === "ResetRequired" ? NO_ITEMS : interpretation.items;
|
|
192
197
|
const decodeCache = useMemo(() => /* @__PURE__ */ new WeakMap(), [ref]);
|
|
193
|
-
const decodedResults = useMemo(() =>
|
|
198
|
+
const decodedResults = useMemo(() => Array.map(encodedItems, (item) => {
|
|
194
199
|
if (typeof item !== "object" || item === null) return Ref.decodePaginationPageSync(ref, [item])[0];
|
|
195
200
|
const cached = decodeCache.get(item);
|
|
196
201
|
if (cached !== void 0) return cached;
|
|
@@ -296,7 +301,6 @@ const invokeAsResult = (ref, invoke, args) => {
|
|
|
296
301
|
throw Cause.squash(exit.cause);
|
|
297
302
|
});
|
|
298
303
|
};
|
|
299
|
-
//#endregion
|
|
300
304
|
export { OptimisticLocalStore_exports as OptimisticLocalStore, PaginatedQueryResult_exports as PaginatedQueryResult, QueryResult_exports as QueryResult, StreamPagination_exports as StreamPagination, useAction, useMutation, usePaginatedQuery, useQuery, useStreamPaginatedQuery };
|
|
301
305
|
|
|
302
306
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useConvexQuery","QueryResult.load","QueryResult.succeed","QueryResult.fail","convexVersion","PaginatedQueryResult.failure","PaginatedQueryResult.loadingFirstPage","PaginatedQueryResult.loadingMore","PaginatedQueryResult.canLoadMore","PaginatedQueryResult.exhausted","StreamPagination.empty","StreamPagination.initial","StreamPagination.pageRequests","useConvexQueries","StreamPagination.interpret","StreamPagination.isLastPageSplitting","StreamPagination.loadMore","OptimisticLocalStore.make","useConvexMutation","useConvexAction"],"sources":["../src/index.ts"],"sourcesContent":["import { Ref } from \"@confect/core\";\nimport { version as convexVersion } from \"convex\";\nimport type { OptimisticUpdate as ConvexOptimisticUpdate } from \"convex/browser\";\nimport * as ConvexReact from \"convex/react\";\nimport type { usePaginatedQuery as useConvexPaginatedQuery } from \"convex/react\";\nimport {\n useAction as useConvexAction,\n useMutation as useConvexMutation,\n useQueries as useConvexQueries,\n useQuery as useConvexQuery,\n type ReactMutation as ConvexReactMutation,\n} from \"convex/react\";\nimport { getFunctionName, type FunctionReference } from \"convex/server\";\nimport { ConvexError, convexToJson, type Value } from \"convex/values\";\nimport * as Cause from \"effect/Cause\";\nimport * as Effect from \"effect/Effect\";\nimport * as Result from \"effect/Result\";\nimport * as Exit from \"effect/Exit\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport * as OptimisticLocalStore from \"./OptimisticLocalStore\";\nimport * as PaginatedQueryResult from \"./PaginatedQueryResult\";\nimport * as QueryResult from \"./QueryResult\";\nimport * as StreamPagination from \"./StreamPagination\";\n\nexport {\n OptimisticLocalStore,\n PaginatedQueryResult,\n QueryResult,\n StreamPagination,\n};\n\nexport type InvokeReturn<Ref_ extends Ref.Any> = [Ref.Error<Ref_>] extends [\n never,\n]\n ? Promise<Ref.Returns<Ref_>>\n : Promise<Result.Result<Ref.Returns<Ref_>, Ref.Error<Ref_>>>;\n\ntype UseQueryArgs<Query extends Ref.AnyPublicQuery> =\n keyof Ref.Args<Query> extends never\n ? [args?: Ref.Args<Query> | \"skip\"]\n : [args: Ref.Args<Query> | \"skip\"];\n\nexport const useQuery = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: UseQueryArgs<Query>\n): QueryResult.QueryResult<Ref.Returns<Query>, Ref.Error<Query>> => {\n const functionReference = Ref.getFunctionReference(ref);\n const args = rest[0];\n const skipped = args === \"skip\";\n const encodedArgs = skipped\n ? \"skip\"\n : Ref.encodeArgsSync(ref, (args ?? {}) as Ref.Args<Query>);\n\n // `useConvexQuery` returns a referentially stable value while the underlying\n // Convex result is unchanged, and throws a stable error when the query\n // fails. We capture either outcome as a `Result` and decode/wrap it inside\n // `useMemo` so that the returned `QueryResult` keeps a stable identity across\n // renders when nothing has actually changed. Decoding on every render would\n // hand consumers a fresh object each time, breaking effects and memoization\n // that depend on the result's identity.\n const encodedReturnsOrError: Result.Result<unknown, unknown> = Result.try(\n () => useConvexQuery(functionReference, encodedArgs),\n );\n\n return useMemo(\n () =>\n Result.match(encodedReturnsOrError, {\n onSuccess: (encodedReturnsOrUndefined) =>\n encodedReturnsOrUndefined === undefined\n ? QueryResult.load(skipped)\n : QueryResult.succeed(\n Ref.decodeReturnsSync(ref, encodedReturnsOrUndefined),\n ),\n onFailure: (error) => {\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return QueryResult.fail(decoded.value);\n }\n }\n throw error;\n },\n }),\n // `Result.try` allocates a fresh wrapper each render, so we key the memo on\n // the stable value it carries (the Convex result or thrown error) rather\n // than the wrapper itself; the decoded result is a function of that value,\n // `ref`, and `skipped`.\n [ref, skipped, Result.merge(encodedReturnsOrError)],\n );\n};\n\n/**\n * Like `Omit`, but implemented with key remapping so that optional modifiers\n * are preserved and index signatures don't reintroduce the omitted key's\n * literal type. Mirrors `BetterOmit` from `convex/server`.\n */\ntype OmitKey<T, K extends PropertyKey> = {\n [P in keyof T as P extends K ? never : P]: T[P];\n};\n\n/**\n * The args accepted by {@link usePaginatedQuery}: the ref's args without\n * `paginationOpts`, which the underlying Convex hook manages itself. When no\n * args remain, resolves to `Record<string, never>` (only the empty object is\n * accepted) rather than `{}`, which would accept any non-nullish value.\n */\nexport type PaginatedQueryArgs<Query extends Ref.AnyPublicPaginatedQuery> =\n OmitKey<Ref.Args<Query>, \"paginationOpts\"> extends infer Args_\n ? keyof Args_ extends never\n ? Record<string, never>\n : Args_\n : never;\n\n/**\n * The item type for a paginated query: the element type of the `page` field of\n * the ref's returns.\n */\nexport type PaginatedQueryItem<Query extends Ref.AnyPublicPaginatedQuery> =\n Ref.Returns<Query>[\"page\"][number];\n\n/**\n * The args parameter of {@link usePaginatedQuery}: the ref's args without\n * `paginationOpts`, or `\"skip\"` to skip the query.\n */\nexport type UsePaginatedQueryArgs<Query extends Ref.AnyPublicPaginatedQuery> =\n | PaginatedQueryArgs<Query>\n | \"skip\";\n\nexport type PaginatedQueryOptions = Parameters<\n typeof useConvexPaginatedQuery\n>[2];\n\n/**\n * The `user`-facing result of `usePaginatedQueryInternal` from `convex/react`,\n * including the `\"Error\"` status its non-throwing mode can return.\n */\ninterface ConvexPaginatedQueryInternalUser {\n readonly results: ReadonlyArray<unknown>;\n readonly status:\n | \"LoadingFirstPage\"\n | \"LoadingMore\"\n | \"CanLoadMore\"\n | \"Exhausted\"\n | \"Error\";\n readonly isLoading: boolean;\n readonly loadMore: (numItems: number) => void;\n readonly error?: unknown;\n}\n\ntype UseConvexPaginatedQueryInternal = (\n query: FunctionReference<\"query\">,\n args: Record<string, Value> | \"skip\",\n options: PaginatedQueryOptions,\n throwOnError: boolean,\n) => { user: ConvexPaginatedQueryInternalUser };\n\n// `usePaginatedQueryInternal` is runtime-exported by convex/react but absent\n// from its public type declarations. It is the only way to observe query\n// errors as values: the public positional `usePaginatedQuery` hard-codes\n// throwOnError and throws mid-hook-sequence, which cannot be caught without\n// breaking React's hook-order invariant.\nconst useConvexPaginatedQueryInternal = (\n ConvexReact as unknown as Record<string, unknown>\n).usePaginatedQueryInternal as UseConvexPaginatedQueryInternal | undefined;\n\nconst MINIMUM_CONVEX_VERSION = \"1.36.0\";\n\n/**\n * The non-throwing mode of `usePaginatedQueryInternal`—its fourth,\n * `throwOnError` parameter—arrived in convex 1.36.0. Convex 1.32 through 1.35\n * export the same symbol taking only three parameters, where a fourth argument\n * is silently ignored and errors are always thrown.\n *\n * The function itself cannot be interrogated for this: `Function.length` counts\n * parameters up to the first one with a default, and 1.36.0 declares\n * `throwOnError = true`, so both shapes report an arity of 3. The package\n * version is the only reliable signal.\n */\nconst supportsErrorsAsValues = ((): boolean => {\n const [major, minor] = convexVersion.split(\".\").map(Number);\n if (\n major === undefined ||\n minor === undefined ||\n Number.isNaN(major) ||\n Number.isNaN(minor)\n ) {\n return false;\n }\n const [minimumMajor, minimumMinor] = MINIMUM_CONVEX_VERSION.split(\".\").map(\n Number,\n ) as [number, number];\n return (\n major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)\n );\n})();\n\n/**\n * Load data reactively from a paginated query defined with\n * `FunctionSpec.publicPaginatedQuery`, mirroring the ergonomics of\n * `usePaginatedQuery` from `convex/react`.\n *\n * Args are encoded via the ref's user-args schema (`paginationOpts` is managed\n * by the Convex hook, not the caller), and each loaded page is decoded via the\n * ref's item schema.\n *\n * Returns a {@link PaginatedQueryResult.PaginatedQueryResult}: the loaded\n * variants carry `results` and `isLoading`, and `CanLoadMore` additionally\n * carries `loadMore`; if the `Ref` declares an `error` schema and the query\n * fails with that typed error, the decoded error is returned as the `Failure`\n * variant, which also carries the pages loaded before the failure. Unknown\n * errors are thrown, to be caught by an error boundary.\n */\nexport const usePaginatedQuery = <Query extends Ref.AnyPublicPaginatedQuery>(\n ref: Query,\n args: UsePaginatedQueryArgs<Query>,\n options: PaginatedQueryOptions,\n): PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n> => {\n if (\n useConvexPaginatedQueryInternal === undefined ||\n !supportsErrorsAsValues\n ) {\n throw new Error(\n `usePaginatedQuery requires convex >= ${MINIMUM_CONVEX_VERSION}, but found ` +\n `${convexVersion}. Earlier versions always throw paginated query errors ` +\n \"instead of returning them, so a declared `error` schema cannot be \" +\n \"surfaced as a `Failure`—upgrade the `convex` package.\",\n );\n }\n\n const functionReference = Ref.getFunctionReference(ref);\n const skipped = args === \"skip\";\n\n // The encoded output is the wire form Convex's hook forwards verbatim, not\n // the ref's decoded args type.\n const encodedArgs = useMemo(\n () =>\n args === \"skip\"\n ? (\"skip\" as const)\n : (Ref.encodePaginatedQueryArgsSync(\n ref,\n args as unknown as Omit<Ref.Args<Query>, \"paginationOpts\">,\n ) as Record<string, Value>),\n [ref, args],\n );\n\n const { user: convexResult } = useConvexPaginatedQueryInternal(\n functionReference,\n encodedArgs,\n options,\n false,\n );\n\n // The Convex hook carries the pages loaded so far on every status,\n // failures included, so results are decoded unconditionally.\n //\n // Decoding allocates fresh items, so key on the referentially stable\n // `results` the Convex hook provides—the same identity-preservation\n // rationale as in `useQuery` above.\n const { results: encodedResults } = convexResult;\n const decodedResults = useMemo(\n () => Ref.decodePaginationPageSync(ref, encodedResults),\n [ref, encodedResults],\n );\n\n const { status, loadMore } = convexResult;\n const error = status === \"Error\" ? convexResult.error : undefined;\n\n return useMemo(\n (): PaginatedQueryResult.Variants<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n > =>\n // `status` is a bare string union rather than a tagged one, so the arms\n // match on literals.\n Match.value(status).pipe(\n Match.when(\"Error\", () => {\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return PaginatedQueryResult.failure({\n error: decoded.value,\n results: decodedResults,\n });\n }\n }\n // Unknown errors still throw. All hooks have run by this point, so\n // an aborted render here is hook-order-safe.\n throw error;\n }),\n Match.when(\"LoadingFirstPage\", () =>\n PaginatedQueryResult.loadingFirstPage({ skipped }),\n ),\n Match.when(\"LoadingMore\", () =>\n PaginatedQueryResult.loadingMore({ results: decodedResults }),\n ),\n // `CanLoadMore` is the only status whose `loadMore` does anything—the Convex hook returns an intentional no-op for all the others, so\n // they carry no callback at all.\n Match.when(\"CanLoadMore\", () =>\n PaginatedQueryResult.canLoadMore({\n results: decodedResults,\n loadMore,\n }),\n ),\n Match.when(\"Exhausted\", () =>\n PaginatedQueryResult.exhausted({ results: decodedResults }),\n ),\n Match.exhaustive,\n ),\n // The memo produces `Variants`, the conditional return type's superset—when `E` is `never` the `Failure` arm is unreachable at runtime, which\n // is exactly what the conditional encodes.\n [ref, skipped, decodedResults, status, loadMore, error],\n ) as PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n >;\n};\n\n/**\n * Whether a paginated query error means the stored cursors no longer match the\n * query (a data-dependent query changed underneath us), calling for a full\n * pagination reset rather than a failure.\n */\nconst isInvalidCursorError = (error: Error): boolean =>\n error.message.includes(\"InvalidCursor\") ||\n (error instanceof ConvexError &&\n typeof error.data === \"object\" &&\n error.data !== null &&\n // Both Convex's built-in pagination (which also sets\n // `isConvexSystemError`) and `QueryStream.paginate` signal an invalid\n // cursor with this data shape—the same check `convex/react` performs.\n (error.data as { paginationError?: unknown }).paginationError ===\n \"InvalidCursor\");\n\nconst NO_ITEMS: ReadonlyArray<unknown> = [];\n\n/**\n * EXPERIMENTAL—endCursor-pinned reactive pagination (see\n * `notes/stream-based-querying.md`). Use it with paginated queries whose\n * handlers paginate via `QueryStream.paginate`: those don't write the query\n * journal that {@link usePaginatedQuery}'s built-in reactivity relies on, so\n * gap-free pages must be maintained by the client instead. (It works with any\n * paginated query honoring the `endCursor` protocol field, including the\n * built-in `paginate`.)\n *\n * Each loaded page is pinned to a fixed index range by re-subscribing it with\n * its `continueCursor` echoed back as `endCursor`—pages then grow and shrink\n * reactively but always meet exactly, and a page that outgrows\n * `initialNumItems` is split in two. This is the mechanism of\n * `convex-helpers/react`'s `usePaginatedQuery`, re-expressed over the pure\n * {@link StreamPagination} state machine, with args/items/errors codec'd through\n * the ref's schemas exactly like {@link usePaginatedQuery}.\n */\nexport const useStreamPaginatedQuery = <\n Query extends Ref.AnyPublicPaginatedQuery,\n>(\n ref: Query,\n args: UsePaginatedQueryArgs<Query>,\n options: {\n readonly initialNumItems: number;\n /**\n * Per-page read budgets forwarded as `paginationOpts.maximumRowsRead` and\n * `paginationOpts.maximumBytesRead`: a page that would scan more rows, or\n * read more bytes, than these returns truncated with `SplitRequired` (and\n * the hook splits it) instead of exceeding Convex's query limits on a\n * filter-heavy stream.\n */\n readonly maximumRowsRead?: number;\n readonly maximumBytesRead?: number;\n },\n): PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n> => {\n // `useQueries` requires a *referentially stable* queries object while\n // nothing has changed: its subscription memo keys on identity, and its\n // `useSubscription` re-runs a render-phase state update whenever the\n // subscription changes—an unstable input loops the render. Callers\n // typically pass a fresh `args` literal each render, so everything that\n // feeds the queries object is stabilized by *value* here: the function\n // reference by `ref`, and the encoded args by their serialized form (as\n // `convex/react`'s own paginated hook does).\n const functionReference = useMemo(() => Ref.getFunctionReference(ref), [ref]);\n const skipped = args === \"skip\";\n\n const rawEncodedArgs =\n args === \"skip\"\n ? undefined\n : (Ref.encodePaginatedQueryArgsSync(\n ref,\n args as unknown as Omit<Ref.Args<Query>, \"paginationOpts\">,\n ) as Record<string, Value>);\n const encodedArgsKey =\n rawEncodedArgs === undefined\n ? \"skip\"\n : JSON.stringify(convexToJson(rawEncodedArgs));\n const encodedArgs = useMemo(\n () => rawEncodedArgs,\n // The serialized form stands in for the freshly allocated object.\n [ref, encodedArgsKey],\n );\n\n // A change of query, args, skippedness, or page size restarts pagination\n // from scratch.\n const resetKey = useMemo(\n () =>\n JSON.stringify([\n getFunctionName(functionReference),\n encodedArgsKey,\n options.initialNumItems,\n options.maximumRowsRead ?? null,\n options.maximumBytesRead ?? null,\n ]),\n [\n functionReference,\n encodedArgsKey,\n options.initialNumItems,\n options.maximumRowsRead,\n options.maximumBytesRead,\n ],\n );\n\n const freshState = () =>\n skipped\n ? StreamPagination.empty\n : StreamPagination.initial(options.initialNumItems, options);\n\n const [tracked, setTracked] = useState(() => ({\n resetKey,\n state: freshState(),\n }));\n // Render-phase reset—the React-sanctioned derived-state-from-props\n // pattern, also how `convex/react`'s own paginated hook resets.\n let current = tracked;\n if (current.resetKey !== resetKey) {\n current = { resetKey, state: freshState() };\n setTracked(current);\n }\n\n const applyTransitions = useCallback(\n (\n transitions: ReadonlyArray<\n (state: StreamPagination.State) => StreamPagination.State\n >,\n ) =>\n setTracked((previous) => ({\n resetKey: previous.resetKey,\n state: transitions.reduce(\n (state, transition) => transition(state),\n previous.state,\n ),\n })),\n [],\n );\n\n const queries = useMemo(\n () =>\n StreamPagination.pageRequests(current.state, (page) => ({\n query: functionReference,\n args: { ...encodedArgs, paginationOpts: page },\n })),\n [current.state, functionReference, encodedArgs],\n );\n\n const resultsObject = useConvexQueries(\n queries as unknown as Parameters<typeof useConvexQueries>[0],\n );\n\n const interpretation = useMemo(\n () =>\n StreamPagination.interpret(\n current.state,\n resultsObject as StreamPagination.Results,\n { initialNumItems: options.initialNumItems, isInvalidCursorError },\n ),\n [current.state, resultsObject, options.initialNumItems],\n );\n\n // Apply the transitions this render discovered (completed split swaps,\n // new splits of overgrown pages) or restart after an invalid cursor—render-phase state updates, as in `convex-helpers`' hook. Both settle:\n // the updated state no longer produces the same discovery.\n if (interpretation._tag === \"ResetRequired\") {\n setTracked((previous) => ({\n resetKey: previous.resetKey,\n state: freshState(),\n }));\n } else if (\n interpretation._tag === \"Interpreted\" &&\n interpretation.transitions.length > 0\n ) {\n applyTransitions(interpretation.transitions);\n }\n\n const encodedItems =\n interpretation._tag === \"ResetRequired\" ? NO_ITEMS : interpretation.items;\n // Page results keep their identity while unchanged (only the page that\n // actually updated is a fresh object), so caching decodes per encoded\n // item makes a single-page update decode only that page's items rather\n // than every loaded page's.\n const decodeCache = useMemo(\n () => new WeakMap<object, PaginatedQueryItem<Query>>(),\n [ref],\n );\n const decodedResults = useMemo(\n () =>\n encodedItems.map((item): PaginatedQueryItem<Query> => {\n if (typeof item !== \"object\" || item === null) {\n return Ref.decodePaginationPageSync(ref, [\n item,\n ])[0] as PaginatedQueryItem<Query>;\n }\n const cached = decodeCache.get(item);\n if (cached !== undefined) {\n return cached;\n }\n const decoded = Ref.decodePaginationPageSync(ref, [\n item,\n ])[0] as PaginatedQueryItem<Query>;\n decodeCache.set(item, decoded);\n return decoded;\n }),\n [ref, encodedItems, decodeCache],\n );\n\n return useMemo((): PaginatedQueryResult.Variants<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n > => {\n if (interpretation._tag === \"ResetRequired\") {\n return PaginatedQueryResult.loadingFirstPage({ skipped });\n }\n if (interpretation._tag === \"Failed\") {\n const error = interpretation.error;\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return PaginatedQueryResult.failure({\n error: decoded.value,\n results: decodedResults,\n });\n }\n }\n // Unknown errors still throw, to be caught by an error boundary.\n throw error;\n }\n\n const { lastResult } = interpretation;\n if (Option.isNone(lastResult) && current.state.pageKeys.length <= 1) {\n return PaginatedQueryResult.loadingFirstPage({ skipped });\n }\n if (\n Option.isNone(lastResult) ||\n StreamPagination.isLastPageSplitting(current.state)\n ) {\n return PaginatedQueryResult.loadingMore({ results: decodedResults });\n }\n if (lastResult.value.isDone) {\n return PaginatedQueryResult.exhausted({ results: decodedResults });\n }\n\n const continueCursor = lastResult.value.continueCursor;\n // A per-result guard, as in `convex-helpers`: calling `loadMore`\n // repeatedly before the next render is a single load.\n let alreadyLoadingMore = false;\n return PaginatedQueryResult.canLoadMore({\n results: decodedResults,\n loadMore: (numItems: number) => {\n if (!alreadyLoadingMore) {\n alreadyLoadingMore = true;\n applyTransitions([\n StreamPagination.loadMore(continueCursor, numItems, options),\n ]);\n }\n },\n });\n }, [\n interpretation,\n decodedResults,\n current.state,\n skipped,\n ref,\n applyTransitions,\n ]) as PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n >;\n};\n\n/**\n * An optimistic update for a Confect mutation. Mirrors Convex's\n * `OptimisticUpdate`, but receives a Confect {@link OptimisticLocalStore} and\n * the decoded mutation `args`.\n */\nexport type OptimisticUpdate<Mutation extends Ref.AnyPublicMutation> = (\n localStore: OptimisticLocalStore.OptimisticLocalStore,\n args: Ref.Args<Mutation>,\n) => void;\n\n/**\n * The handle returned by {@link useMutation}. It is callable like the function\n * returned by Convex's `useMutation`, and additionally exposes\n * `withOptimisticUpdate` for attaching an optimistic update. Mirrors the\n * `ReactMutation` type from `convex/react`.\n */\nexport interface ReactMutation<Mutation extends Ref.AnyPublicMutation> {\n (...args: Ref.OptionalArgs<Mutation>): InvokeReturn<Mutation>;\n withOptimisticUpdate(\n optimisticUpdate: OptimisticUpdate<Mutation>,\n ): ReactMutation<Mutation>;\n}\n\nconst makeReactMutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n convexReactMutation: ConvexReactMutation<\n Ref.FunctionReference<Mutation> & FunctionReference<\"mutation\">\n >,\n): ReactMutation<Mutation> => {\n const callable = ((...args: Ref.OptionalArgs<Mutation>) =>\n invokeAsResult(\n ref,\n (_, encodedArgs) => convexReactMutation(encodedArgs as never),\n args,\n ).then((result) =>\n Ref.hasErrorSchema(ref) ? result : Result.getOrThrow(result),\n )) as (...args: Ref.OptionalArgs<Mutation>) => InvokeReturn<Mutation>;\n\n const withOptimisticUpdate = (\n optimisticUpdate: OptimisticUpdate<Mutation>,\n ): ReactMutation<Mutation> => {\n const wrappedUpdate: ConvexOptimisticUpdate<Record<string, Value>> = (\n convexLocalStore,\n encodedArgs,\n ) => {\n const decodedArgs = Ref.decodeArgsSync(ref, encodedArgs);\n optimisticUpdate(\n OptimisticLocalStore.make(convexLocalStore),\n decodedArgs,\n );\n };\n const nextConvexReactMutation =\n convexReactMutation.withOptimisticUpdate(wrappedUpdate);\n return makeReactMutation(ref, nextConvexReactMutation);\n };\n\n return Object.assign(callable, { withOptimisticUpdate });\n};\n\n/**\n * Returns a {@link ReactMutation} handle for the provided `Ref`'s mutation. The\n * handle is callable to invoke the mutation, and exposes `withOptimisticUpdate`\n * for attaching an optimistic update, mirroring `useMutation` from\n * `convex/react`.\n *\n * If the `Ref` declares an `error` schema, the returned promise resolves to a\n * `Result` with the decoded `returns` value in the `Success` and the decoded\n * error in the `Failure`.\n *\n * If the `Ref` does not declare an `error` schema, the promise resolves\n * directly to the decoded `returns` value, matching the behavior of\n * `useMutation` from `convex/react`.\n *\n * Any other failure rejects the promise.\n */\nexport const useMutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n): ReactMutation<Mutation> => {\n const functionReference = Ref.getFunctionReference(ref);\n const convexReactMutation = useConvexMutation(functionReference);\n\n return useMemo(\n () =>\n makeReactMutation(\n ref,\n convexReactMutation as ConvexReactMutation<\n Ref.FunctionReference<Mutation> & FunctionReference<\"mutation\">\n >,\n ),\n [ref, convexReactMutation],\n );\n};\n\n/**\n * Returns a function that invokes the provided `Ref`'s action.\n *\n * If the `Ref` declares an `error` schema, the returned promise resolves to a\n * `Result` with the decoded `returns` value in the `Success` and the decoded\n * error in the `Failure`.\n *\n * If the `Ref` does not declare an `error` schema, the promise resolves\n * directly to the decoded `returns` value, matching the behavior of\n * `useMutation` from `convex/react`.\n *\n * Any other failure rejects the promise.\n */\nexport const useAction = <Action extends Ref.AnyPublicAction>(\n ref: Action,\n): ((...args: Ref.OptionalArgs<Action>) => InvokeReturn<Action>) => {\n const functionReference = Ref.getFunctionReference(ref);\n const actualAction = useConvexAction(functionReference);\n\n return useCallback(\n ((...args: Ref.OptionalArgs<Action>) =>\n invokeAsResult(\n ref,\n (_, encodedArgs) => actualAction(encodedArgs),\n args,\n ).then((result) =>\n Ref.hasErrorSchema(ref) ? result : Result.getOrThrow(result),\n )) as (...args: Ref.OptionalArgs<Action>) => InvokeReturn<Action>,\n [ref, actualAction],\n );\n};\n\nconst invokeAsResult = <Ref_ extends Ref.Any>(\n ref: Ref_,\n invoke: (\n fnRef: Ref.FunctionReference<Ref_>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>,\n args: Ref.OptionalArgs<Ref_>,\n): Promise<Result.Result<Ref.Returns<Ref_>, Ref.Error<Ref_>>> => {\n const exitPromise = Effect.runPromiseExit(\n Ref.runWithCodec(ref, (args[0] ?? {}) as Ref.Args<Ref_>, invoke).pipe(\n Effect.catchTag(\"SchemaError\", Effect.die),\n Effect.result,\n ),\n );\n return exitPromise.then((exit) => {\n if (Exit.isSuccess(exit)) return exit.value;\n throw Cause.squash(exit.cause);\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useConvexQuery","QueryResult.load","QueryResult.succeed","QueryResult.fail","convexVersion","PaginatedQueryResult.failure","PaginatedQueryResult.loadingFirstPage","PaginatedQueryResult.loadingMore","PaginatedQueryResult.canLoadMore","PaginatedQueryResult.exhausted","StreamPagination.empty","StreamPagination.initial","StreamPagination.pageRequests","useConvexQueries","StreamPagination.interpret","StreamPagination.isLastPageSplitting","StreamPagination.loadMore","OptimisticLocalStore.make","useConvexMutation","useConvexAction"],"sources":["../src/index.ts"],"sourcesContent":["import { Ref } from \"@confect/core\";\nimport { version as convexVersion } from \"convex\";\nimport type { OptimisticUpdate as ConvexOptimisticUpdate } from \"convex/browser\";\nimport * as ConvexReact from \"convex/react\";\nimport type { usePaginatedQuery as useConvexPaginatedQuery } from \"convex/react\";\nimport {\n useAction as useConvexAction,\n useMutation as useConvexMutation,\n useQueries as useConvexQueries,\n useQuery as useConvexQuery,\n type ReactMutation as ConvexReactMutation,\n} from \"convex/react\";\nimport { getFunctionName, type FunctionReference } from \"convex/server\";\nimport { ConvexError, convexToJson, type Value } from \"convex/values\";\nimport * as Cause from \"effect/Cause\";\nimport * as Array from \"effect/Array\";\nimport * as String from \"effect/String\";\nimport * as Schema from \"effect/Schema\";\nimport { pipe } from \"effect/Function\";\nimport * as Effect from \"effect/Effect\";\nimport * as Result from \"effect/Result\";\nimport * as Exit from \"effect/Exit\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport { useCallback, useMemo, useState } from \"react\";\n\nimport * as OptimisticLocalStore from \"./OptimisticLocalStore\";\nimport * as PaginatedQueryResult from \"./PaginatedQueryResult\";\nimport * as QueryResult from \"./QueryResult\";\nimport * as StreamPagination from \"./StreamPagination\";\n\nconst encodeJson = Schema.Unknown.pipe(\n Schema.fromJsonString,\n Schema.encodeResult,\n);\n\nexport {\n OptimisticLocalStore,\n PaginatedQueryResult,\n QueryResult,\n StreamPagination,\n};\n\nexport type InvokeReturn<Ref_ extends Ref.Any> = [Ref.Error<Ref_>] extends [\n never,\n]\n ? Promise<Ref.Returns<Ref_>>\n : Promise<Result.Result<Ref.Returns<Ref_>, Ref.Error<Ref_>>>;\n\ntype UseQueryArgs<Query extends Ref.AnyPublicQuery> =\n keyof Ref.Args<Query> extends never\n ? [args?: Ref.Args<Query> | \"skip\"]\n : [args: Ref.Args<Query> | \"skip\"];\n\nexport const useQuery = <Query extends Ref.AnyPublicQuery>(\n ref: Query,\n ...rest: UseQueryArgs<Query>\n): QueryResult.QueryResult<Ref.Returns<Query>, Ref.Error<Query>> => {\n const functionReference = Ref.getFunctionReference(ref);\n const args = rest[0];\n const skipped = args === \"skip\";\n const encodedArgs = skipped\n ? \"skip\"\n : Ref.encodeArgsSync(ref, (args ?? {}) as Ref.Args<Query>);\n\n // `useConvexQuery` returns a referentially stable value while the underlying\n // Convex result is unchanged, and throws a stable error when the query\n // fails. We capture either outcome as a `Result` and decode/wrap it inside\n // `useMemo` so that the returned `QueryResult` keeps a stable identity across\n // renders when nothing has actually changed. Decoding on every render would\n // hand consumers a fresh object each time, breaking effects and memoization\n // that depend on the result's identity.\n const encodedReturnsOrError: Result.Result<unknown, unknown> = Result.try(\n () => useConvexQuery(functionReference, encodedArgs),\n );\n\n return useMemo(\n () =>\n Result.match(encodedReturnsOrError, {\n onSuccess: (encodedReturnsOrUndefined) =>\n encodedReturnsOrUndefined === undefined\n ? QueryResult.load(skipped)\n : QueryResult.succeed(\n Ref.decodeReturnsSync(ref, encodedReturnsOrUndefined),\n ),\n onFailure: (error) => {\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return QueryResult.fail(decoded.value);\n }\n }\n throw error;\n },\n }),\n // `Result.try` allocates a fresh wrapper each render, so we key the memo on\n // the stable value it carries (the Convex result or thrown error) rather\n // than the wrapper itself; the decoded result is a function of that value,\n // `ref`, and `skipped`.\n [ref, skipped, Result.merge(encodedReturnsOrError)],\n );\n};\n\n/**\n * Like `Omit`, but implemented with key remapping so that optional modifiers\n * are preserved and index signatures don't reintroduce the omitted key's\n * literal type. Mirrors `BetterOmit` from `convex/server`.\n */\ntype OmitKey<T, K extends PropertyKey> = {\n [P in keyof T as P extends K ? never : P]: T[P];\n};\n\n/**\n * The args accepted by {@link usePaginatedQuery}: the ref's args without\n * `paginationOpts`, which the underlying Convex hook manages itself. When no\n * args remain, resolves to `Record<string, never>` (only the empty object is\n * accepted) rather than `{}`, which would accept any non-nullish value.\n */\nexport type PaginatedQueryArgs<Query extends Ref.AnyPublicPaginatedQuery> =\n OmitKey<Ref.Args<Query>, \"paginationOpts\"> extends infer Args_\n ? keyof Args_ extends never\n ? Record<string, never>\n : Args_\n : never;\n\n/**\n * The item type for a paginated query: the element type of the `page` field of\n * the ref's returns.\n */\nexport type PaginatedQueryItem<Query extends Ref.AnyPublicPaginatedQuery> =\n Ref.Returns<Query>[\"page\"][number];\n\n/**\n * The args parameter of {@link usePaginatedQuery}: the ref's args without\n * `paginationOpts`, or `\"skip\"` to skip the query.\n */\nexport type UsePaginatedQueryArgs<Query extends Ref.AnyPublicPaginatedQuery> =\n | PaginatedQueryArgs<Query>\n | \"skip\";\n\nexport type PaginatedQueryOptions = Parameters<\n typeof useConvexPaginatedQuery\n>[2];\n\n/**\n * The `user`-facing result of `usePaginatedQueryInternal` from `convex/react`,\n * including the `\"Error\"` status its non-throwing mode can return.\n */\ninterface ConvexPaginatedQueryInternalUser {\n readonly results: ReadonlyArray<unknown>;\n readonly status:\n | \"LoadingFirstPage\"\n | \"LoadingMore\"\n | \"CanLoadMore\"\n | \"Exhausted\"\n | \"Error\";\n readonly isLoading: boolean;\n readonly loadMore: (numItems: number) => void;\n readonly error?: unknown;\n}\n\ntype UseConvexPaginatedQueryInternal = (\n query: FunctionReference<\"query\">,\n args: Record<string, Value> | \"skip\",\n options: PaginatedQueryOptions,\n throwOnError: boolean,\n) => { user: ConvexPaginatedQueryInternalUser };\n\n// `usePaginatedQueryInternal` is runtime-exported by convex/react but absent\n// from its public type declarations. It is the only way to observe query\n// errors as values: the public positional `usePaginatedQuery` hard-codes\n// throwOnError and throws mid-hook-sequence, which cannot be caught without\n// breaking React's hook-order invariant.\nconst useConvexPaginatedQueryInternal = (\n ConvexReact as unknown as Record<string, unknown>\n).usePaginatedQueryInternal as UseConvexPaginatedQueryInternal | undefined;\n\nconst MINIMUM_CONVEX_VERSION = \"1.36.0\";\n\n/**\n * The non-throwing mode of `usePaginatedQueryInternal`—its fourth,\n * `throwOnError` parameter—arrived in convex 1.36.0. Convex 1.32 through 1.35\n * export the same symbol taking only three parameters, where a fourth argument\n * is silently ignored and errors are always thrown.\n *\n * The function itself cannot be interrogated for this: `Function.length` counts\n * parameters up to the first one with a default, and 1.36.0 declares\n * `throwOnError = true`, so both shapes report an arity of 3. The package\n * version is the only reliable signal.\n */\nconst supportsErrorsAsValues = ((): boolean => {\n const [major, minor] = pipe(\n convexVersion,\n String.split(\".\"),\n Array.map(Number),\n );\n if (\n major === undefined ||\n minor === undefined ||\n Number.isNaN(major) ||\n Number.isNaN(minor)\n ) {\n return false;\n }\n const [minimumMajor, minimumMinor] = pipe(\n MINIMUM_CONVEX_VERSION,\n String.split(\".\"),\n Array.map(Number),\n ) as [number, number];\n return (\n major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)\n );\n})();\n\n/**\n * Load data reactively from a paginated query defined with\n * `FunctionSpec.publicPaginatedQuery`, mirroring the ergonomics of\n * `usePaginatedQuery` from `convex/react`.\n *\n * Args are encoded via the ref's user-args schema (`paginationOpts` is managed\n * by the Convex hook, not the caller), and each loaded page is decoded via the\n * ref's item schema.\n *\n * Returns a {@link PaginatedQueryResult.PaginatedQueryResult}: the loaded\n * variants carry `results` and `isLoading`, and `CanLoadMore` additionally\n * carries `loadMore`; if the `Ref` declares an `error` schema and the query\n * fails with that typed error, the decoded error is returned as the `Failure`\n * variant, which also carries the pages loaded before the failure. Unknown\n * errors are thrown, to be caught by an error boundary.\n */\nexport const usePaginatedQuery = <Query extends Ref.AnyPublicPaginatedQuery>(\n ref: Query,\n args: UsePaginatedQueryArgs<Query>,\n options: PaginatedQueryOptions,\n): PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n> => {\n if (\n useConvexPaginatedQueryInternal === undefined ||\n !supportsErrorsAsValues\n ) {\n throw new Error(\n `usePaginatedQuery requires convex >= ${MINIMUM_CONVEX_VERSION}, but found ` +\n `${convexVersion}. Earlier versions always throw paginated query errors ` +\n \"instead of returning them, so a declared `error` schema cannot be \" +\n \"surfaced as a `Failure`—upgrade the `convex` package.\",\n );\n }\n\n const functionReference = Ref.getFunctionReference(ref);\n const skipped = args === \"skip\";\n\n // The encoded output is the wire form Convex's hook forwards verbatim, not\n // the ref's decoded args type.\n const encodedArgs = useMemo(\n () =>\n args === \"skip\"\n ? (\"skip\" as const)\n : (Ref.encodePaginatedQueryArgsSync(\n ref,\n args as unknown as Omit<Ref.Args<Query>, \"paginationOpts\">,\n ) as Record<string, Value>),\n [ref, args],\n );\n\n const { user: convexResult } = useConvexPaginatedQueryInternal(\n functionReference,\n encodedArgs,\n options,\n false,\n );\n\n // The Convex hook carries the pages loaded so far on every status,\n // failures included, so results are decoded unconditionally.\n //\n // Decoding allocates fresh items, so key on the referentially stable\n // `results` the Convex hook provides—the same identity-preservation\n // rationale as in `useQuery` above.\n const { results: encodedResults } = convexResult;\n const decodedResults = useMemo(\n () => Ref.decodePaginationPageSync(ref, encodedResults),\n [ref, encodedResults],\n );\n\n const { status, loadMore } = convexResult;\n const error = status === \"Error\" ? convexResult.error : undefined;\n\n return useMemo(\n (): PaginatedQueryResult.Variants<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n > =>\n // `status` is a bare string union rather than a tagged one, so the arms\n // match on literals.\n Match.value(status).pipe(\n Match.when(\"Error\", () => {\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return PaginatedQueryResult.failure({\n error: decoded.value,\n results: decodedResults,\n });\n }\n }\n // Unknown errors still throw. All hooks have run by this point, so\n // an aborted render here is hook-order-safe.\n throw error;\n }),\n Match.when(\"LoadingFirstPage\", () =>\n PaginatedQueryResult.loadingFirstPage({ skipped }),\n ),\n Match.when(\"LoadingMore\", () =>\n PaginatedQueryResult.loadingMore({ results: decodedResults }),\n ),\n // `CanLoadMore` is the only status whose `loadMore` does anything—the Convex hook returns an intentional no-op for all the others, so\n // they carry no callback at all.\n Match.when(\"CanLoadMore\", () =>\n PaginatedQueryResult.canLoadMore({\n results: decodedResults,\n loadMore,\n }),\n ),\n Match.when(\"Exhausted\", () =>\n PaginatedQueryResult.exhausted({ results: decodedResults }),\n ),\n Match.exhaustive,\n ),\n // The memo produces `Variants`, the conditional return type's superset—when `E` is `never` the `Failure` arm is unreachable at runtime, which\n // is exactly what the conditional encodes.\n [ref, skipped, decodedResults, status, loadMore, error],\n ) as PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n >;\n};\n\n/**\n * Whether a paginated query error means the stored cursors no longer match the\n * query (a data-dependent query changed underneath us), calling for a full\n * pagination reset rather than a failure.\n */\nconst isInvalidCursorError = (error: Error): boolean =>\n pipe(error.message, String.includes(\"InvalidCursor\")) ||\n (error instanceof ConvexError &&\n typeof error.data === \"object\" &&\n error.data !== null &&\n // Both Convex's built-in pagination (which also sets\n // `isConvexSystemError`) and `QueryStream.paginate` signal an invalid\n // cursor with this data shape—the same check `convex/react` performs.\n (error.data as { paginationError?: unknown }).paginationError ===\n \"InvalidCursor\");\n\nconst NO_ITEMS: ReadonlyArray<unknown> = [];\n\n/**\n * EXPERIMENTAL—endCursor-pinned reactive pagination (see\n * `notes/stream-based-querying.md`). Use it with paginated queries whose\n * handlers paginate via `QueryStream.paginate`: those don't write the query\n * journal that {@link usePaginatedQuery}'s built-in reactivity relies on, so\n * gap-free pages must be maintained by the client instead. (It works with any\n * paginated query honoring the `endCursor` protocol field, including the\n * built-in `paginate`.)\n *\n * Each loaded page is pinned to a fixed index range by re-subscribing it with\n * its `continueCursor` echoed back as `endCursor`—pages then grow and shrink\n * reactively but always meet exactly, and a page that outgrows\n * `initialNumItems` is split in two. This is the mechanism of\n * `convex-helpers/react`'s `usePaginatedQuery`, re-expressed over the pure\n * {@link StreamPagination} state machine, with args/items/errors codec'd through\n * the ref's schemas exactly like {@link usePaginatedQuery}.\n */\nexport const useStreamPaginatedQuery = <\n Query extends Ref.AnyPublicPaginatedQuery,\n>(\n ref: Query,\n args: UsePaginatedQueryArgs<Query>,\n options: {\n readonly initialNumItems: number;\n /**\n * Per-page read budgets forwarded as `paginationOpts.maximumRowsRead` and\n * `paginationOpts.maximumBytesRead`: a page that would scan more rows, or\n * read more bytes, than these returns truncated with `SplitRequired` (and\n * the hook splits it) instead of exceeding Convex's query limits on a\n * filter-heavy stream.\n */\n readonly maximumRowsRead?: number;\n readonly maximumBytesRead?: number;\n },\n): PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n> => {\n // `useQueries` requires a *referentially stable* queries object while\n // nothing has changed: its subscription memo keys on identity, and its\n // `useSubscription` re-runs a render-phase state update whenever the\n // subscription changes—an unstable input loops the render. Callers\n // typically pass a fresh `args` literal each render, so everything that\n // feeds the queries object is stabilized by *value* here: the function\n // reference by `ref`, and the encoded args by their serialized form (as\n // `convex/react`'s own paginated hook does).\n const functionReference = useMemo(() => Ref.getFunctionReference(ref), [ref]);\n const skipped = args === \"skip\";\n\n const rawEncodedArgs =\n args === \"skip\"\n ? undefined\n : (Ref.encodePaginatedQueryArgsSync(\n ref,\n args as unknown as Omit<Ref.Args<Query>, \"paginationOpts\">,\n ) as Record<string, Value>);\n const encodedArgsKey =\n rawEncodedArgs === undefined\n ? \"skip\"\n : encodeJson(convexToJson(rawEncodedArgs)).pipe(Result.getOrThrow);\n const encodedArgs = useMemo(\n () => rawEncodedArgs,\n // The serialized form stands in for the freshly allocated object.\n [ref, encodedArgsKey],\n );\n\n // A change of query, args, skippedness, or page size restarts pagination\n // from scratch.\n const resetKey = useMemo(\n () =>\n encodeJson([\n getFunctionName(functionReference),\n encodedArgsKey,\n options.initialNumItems,\n options.maximumRowsRead ?? null,\n options.maximumBytesRead ?? null,\n ]).pipe(Result.getOrThrow),\n [\n functionReference,\n encodedArgsKey,\n options.initialNumItems,\n options.maximumRowsRead,\n options.maximumBytesRead,\n ],\n );\n\n const freshState = () =>\n skipped\n ? StreamPagination.empty\n : StreamPagination.initial(options.initialNumItems, options);\n\n const [tracked, setTracked] = useState(() => ({\n resetKey,\n state: freshState(),\n }));\n // Render-phase reset—the React-sanctioned derived-state-from-props\n // pattern, also how `convex/react`'s own paginated hook resets.\n let current = tracked;\n if (current.resetKey !== resetKey) {\n current = { resetKey, state: freshState() };\n setTracked(current);\n }\n\n const applyTransitions = useCallback(\n (\n transitions: ReadonlyArray<\n (state: StreamPagination.State) => StreamPagination.State\n >,\n ) =>\n setTracked((previous) => ({\n resetKey: previous.resetKey,\n state: Array.reduce(transitions, previous.state, (state, transition) =>\n transition(state),\n ),\n })),\n [],\n );\n\n const queries = useMemo(\n () =>\n StreamPagination.pageRequests(current.state, (page) => ({\n query: functionReference,\n args: { ...encodedArgs, paginationOpts: page },\n })),\n [current.state, functionReference, encodedArgs],\n );\n\n const resultsObject = useConvexQueries(\n queries as unknown as Parameters<typeof useConvexQueries>[0],\n );\n\n const interpretation = useMemo(\n () =>\n StreamPagination.interpret(\n current.state,\n resultsObject as StreamPagination.Results,\n { initialNumItems: options.initialNumItems, isInvalidCursorError },\n ),\n [current.state, resultsObject, options.initialNumItems],\n );\n\n // Apply the transitions this render discovered (completed split swaps,\n // new splits of overgrown pages) or restart after an invalid cursor—render-phase state updates, as in `convex-helpers`' hook. Both settle:\n // the updated state no longer produces the same discovery.\n if (interpretation._tag === \"ResetRequired\") {\n setTracked((previous) => ({\n resetKey: previous.resetKey,\n state: freshState(),\n }));\n } else if (\n interpretation._tag === \"Interpreted\" &&\n interpretation.transitions.length > 0\n ) {\n applyTransitions(interpretation.transitions);\n }\n\n const encodedItems =\n interpretation._tag === \"ResetRequired\" ? NO_ITEMS : interpretation.items;\n // Page results keep their identity while unchanged (only the page that\n // actually updated is a fresh object), so caching decodes per encoded\n // item makes a single-page update decode only that page's items rather\n // than every loaded page's.\n const decodeCache = useMemo(\n () => new WeakMap<object, PaginatedQueryItem<Query>>(),\n [ref],\n );\n const decodedResults = useMemo(\n () =>\n Array.map(encodedItems, (item): PaginatedQueryItem<Query> => {\n if (typeof item !== \"object\" || item === null) {\n return Ref.decodePaginationPageSync(ref, [\n item,\n ])[0] as PaginatedQueryItem<Query>;\n }\n const cached = decodeCache.get(item);\n if (cached !== undefined) {\n return cached;\n }\n const decoded = Ref.decodePaginationPageSync(ref, [\n item,\n ])[0] as PaginatedQueryItem<Query>;\n decodeCache.set(item, decoded);\n return decoded;\n }),\n [ref, encodedItems, decodeCache],\n );\n\n return useMemo((): PaginatedQueryResult.Variants<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n > => {\n if (interpretation._tag === \"ResetRequired\") {\n return PaginatedQueryResult.loadingFirstPage({ skipped });\n }\n if (interpretation._tag === \"Failed\") {\n const error = interpretation.error;\n if (Ref.isConvexError(error)) {\n const decoded = Ref.decodeErrorOption(ref, error.data);\n if (Option.isSome(decoded)) {\n return PaginatedQueryResult.failure({\n error: decoded.value,\n results: decodedResults,\n });\n }\n }\n // Unknown errors still throw, to be caught by an error boundary.\n throw error;\n }\n\n const { lastResult } = interpretation;\n if (Option.isNone(lastResult) && current.state.pageKeys.length <= 1) {\n return PaginatedQueryResult.loadingFirstPage({ skipped });\n }\n if (\n Option.isNone(lastResult) ||\n StreamPagination.isLastPageSplitting(current.state)\n ) {\n return PaginatedQueryResult.loadingMore({ results: decodedResults });\n }\n if (lastResult.value.isDone) {\n return PaginatedQueryResult.exhausted({ results: decodedResults });\n }\n\n const continueCursor = lastResult.value.continueCursor;\n // A per-result guard, as in `convex-helpers`: calling `loadMore`\n // repeatedly before the next render is a single load.\n let alreadyLoadingMore = false;\n return PaginatedQueryResult.canLoadMore({\n results: decodedResults,\n loadMore: (numItems: number) => {\n if (!alreadyLoadingMore) {\n alreadyLoadingMore = true;\n applyTransitions([\n StreamPagination.loadMore(continueCursor, numItems, options),\n ]);\n }\n },\n });\n }, [\n interpretation,\n decodedResults,\n current.state,\n skipped,\n ref,\n applyTransitions,\n ]) as PaginatedQueryResult.PaginatedQueryResult<\n PaginatedQueryItem<Query>,\n Ref.Error<Query>\n >;\n};\n\n/**\n * An optimistic update for a Confect mutation. Mirrors Convex's\n * `OptimisticUpdate`, but receives a Confect {@link OptimisticLocalStore} and\n * the decoded mutation `args`.\n */\nexport type OptimisticUpdate<Mutation extends Ref.AnyPublicMutation> = (\n localStore: OptimisticLocalStore.OptimisticLocalStore,\n args: Ref.Args<Mutation>,\n) => void;\n\n/**\n * The handle returned by {@link useMutation}. It is callable like the function\n * returned by Convex's `useMutation`, and additionally exposes\n * `withOptimisticUpdate` for attaching an optimistic update. Mirrors the\n * `ReactMutation` type from `convex/react`.\n */\nexport interface ReactMutation<Mutation extends Ref.AnyPublicMutation> {\n (...args: Ref.OptionalArgs<Mutation>): InvokeReturn<Mutation>;\n withOptimisticUpdate(\n optimisticUpdate: OptimisticUpdate<Mutation>,\n ): ReactMutation<Mutation>;\n}\n\nconst makeReactMutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n convexReactMutation: ConvexReactMutation<\n Ref.FunctionReference<Mutation> & FunctionReference<\"mutation\">\n >,\n): ReactMutation<Mutation> => {\n const callable = ((...args: Ref.OptionalArgs<Mutation>) =>\n invokeAsResult(\n ref,\n (_, encodedArgs) => convexReactMutation(encodedArgs as never),\n args,\n ).then((result) =>\n Ref.hasErrorSchema(ref) ? result : Result.getOrThrow(result),\n )) as (...args: Ref.OptionalArgs<Mutation>) => InvokeReturn<Mutation>;\n\n const withOptimisticUpdate = (\n optimisticUpdate: OptimisticUpdate<Mutation>,\n ): ReactMutation<Mutation> => {\n const wrappedUpdate: ConvexOptimisticUpdate<Record<string, Value>> = (\n convexLocalStore,\n encodedArgs,\n ) => {\n const decodedArgs = Ref.decodeArgsSync(ref, encodedArgs);\n optimisticUpdate(\n OptimisticLocalStore.make(convexLocalStore),\n decodedArgs,\n );\n };\n const nextConvexReactMutation =\n convexReactMutation.withOptimisticUpdate(wrappedUpdate);\n return makeReactMutation(ref, nextConvexReactMutation);\n };\n\n return Object.assign(callable, { withOptimisticUpdate });\n};\n\n/**\n * Returns a {@link ReactMutation} handle for the provided `Ref`'s mutation. The\n * handle is callable to invoke the mutation, and exposes `withOptimisticUpdate`\n * for attaching an optimistic update, mirroring `useMutation` from\n * `convex/react`.\n *\n * If the `Ref` declares an `error` schema, the returned promise resolves to a\n * `Result` with the decoded `returns` value in the `Success` and the decoded\n * error in the `Failure`.\n *\n * If the `Ref` does not declare an `error` schema, the promise resolves\n * directly to the decoded `returns` value, matching the behavior of\n * `useMutation` from `convex/react`.\n *\n * Any other failure rejects the promise.\n */\nexport const useMutation = <Mutation extends Ref.AnyPublicMutation>(\n ref: Mutation,\n): ReactMutation<Mutation> => {\n const functionReference = Ref.getFunctionReference(ref);\n const convexReactMutation = useConvexMutation(functionReference);\n\n return useMemo(\n () =>\n makeReactMutation(\n ref,\n convexReactMutation as ConvexReactMutation<\n Ref.FunctionReference<Mutation> & FunctionReference<\"mutation\">\n >,\n ),\n [ref, convexReactMutation],\n );\n};\n\n/**\n * Returns a function that invokes the provided `Ref`'s action.\n *\n * If the `Ref` declares an `error` schema, the returned promise resolves to a\n * `Result` with the decoded `returns` value in the `Success` and the decoded\n * error in the `Failure`.\n *\n * If the `Ref` does not declare an `error` schema, the promise resolves\n * directly to the decoded `returns` value, matching the behavior of\n * `useMutation` from `convex/react`.\n *\n * Any other failure rejects the promise.\n */\nexport const useAction = <Action extends Ref.AnyPublicAction>(\n ref: Action,\n): ((...args: Ref.OptionalArgs<Action>) => InvokeReturn<Action>) => {\n const functionReference = Ref.getFunctionReference(ref);\n const actualAction = useConvexAction(functionReference);\n\n return useCallback(\n ((...args: Ref.OptionalArgs<Action>) =>\n invokeAsResult(\n ref,\n (_, encodedArgs) => actualAction(encodedArgs),\n args,\n ).then((result) =>\n Ref.hasErrorSchema(ref) ? result : Result.getOrThrow(result),\n )) as (...args: Ref.OptionalArgs<Action>) => InvokeReturn<Action>,\n [ref, actualAction],\n );\n};\n\nconst invokeAsResult = <Ref_ extends Ref.Any>(\n ref: Ref_,\n invoke: (\n fnRef: Ref.FunctionReference<Ref_>,\n encodedArgs: unknown,\n ) => PromiseLike<unknown>,\n args: Ref.OptionalArgs<Ref_>,\n): Promise<Result.Result<Ref.Returns<Ref_>, Ref.Error<Ref_>>> => {\n const exitPromise = Effect.runPromiseExit(\n Ref.runWithCodec(ref, (args[0] ?? {}) as Ref.Args<Ref_>, invoke).pipe(\n Effect.catchTag(\"SchemaError\", Effect.die),\n Effect.result,\n ),\n );\n return exitPromise.then((exit) => {\n if (Exit.isSuccess(exit)) return exit.value;\n throw Cause.squash(exit.cause);\n });\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@confect/react",
|
|
3
3
|
"description": "Client-side bindings for React apps",
|
|
4
|
-
"version": "10.
|
|
4
|
+
"version": "10.6.0",
|
|
5
5
|
"author": "RJ Dellecese",
|
|
6
6
|
"bugs": {
|
|
7
7
|
"url": "https://github.com/rjdellecese/confect/issues"
|
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@effect/vitest": "4.1.0",
|
|
11
11
|
"@testing-library/react": "16.3.3",
|
|
12
|
-
"@types/node": "26.6.
|
|
12
|
+
"@types/node": "26.6.6",
|
|
13
13
|
"@types/react": "19.3.0",
|
|
14
14
|
"@types/react-dom": "19.3.0",
|
|
15
|
-
"convex": "1.
|
|
15
|
+
"convex": "1.49.0",
|
|
16
16
|
"effect": "4.1.0",
|
|
17
|
-
"happy-dom": "
|
|
18
|
-
"react": "19.3.
|
|
19
|
-
"react-dom": "19.3.
|
|
20
|
-
"tsdown": "0.23.
|
|
21
|
-
"
|
|
17
|
+
"happy-dom": "21.0.4",
|
|
18
|
+
"react": "19.3.1",
|
|
19
|
+
"react-dom": "19.3.1",
|
|
20
|
+
"tsdown": "0.23.7",
|
|
21
|
+
"tsrs": "0.23.0-ts7.1.0-beta",
|
|
22
22
|
"unrun": "0.3.1",
|
|
23
|
-
"vite": "8.3.
|
|
24
|
-
"vitest": "5.0
|
|
23
|
+
"vite": "8.3.6",
|
|
24
|
+
"vitest": "5.1.0"
|
|
25
25
|
},
|
|
26
26
|
"engines": {
|
|
27
27
|
"node": ">=24"
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"main": "./dist/index.js",
|
|
57
57
|
"module": "./dist/index.js",
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@confect/core": "^10.
|
|
59
|
+
"@confect/core": "^10.6.0",
|
|
60
60
|
"convex": "^1.36.0",
|
|
61
61
|
"effect": "^4.0.0",
|
|
62
62
|
"react": "^18.0.0 || ^19.0.0"
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"scripts": {
|
|
72
72
|
"clean": "shx rm -rf dist coverage node_modules",
|
|
73
73
|
"dev": "tsdown --watch --no-clean --config-loader unrun",
|
|
74
|
-
"typecheck": "
|
|
75
|
-
"typecheck:inexact": "
|
|
74
|
+
"typecheck": "tsrs -b tsconfig.src.json",
|
|
75
|
+
"typecheck:inexact": "tsrs --noEmit --project tsconfig.json --exactOptionalPropertyTypes false"
|
|
76
76
|
}
|
|
77
77
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Ref } from "@confect/core";
|
|
2
2
|
import type { OptimisticLocalStore as ConvexOptimisticLocalStore } from "convex/browser";
|
|
3
3
|
import * as Option from "effect/Option";
|
|
4
|
+
import * as Arr from "effect/Array";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* The Confect counterpart to Convex's `OptimisticLocalStore`.
|
|
@@ -48,15 +49,16 @@ export const make = (
|
|
|
48
49
|
},
|
|
49
50
|
getAllQueries: (queryRef) => {
|
|
50
51
|
const functionReference = Ref.getFunctionReference(queryRef);
|
|
51
|
-
return
|
|
52
|
-
.getAllQueries(functionReference)
|
|
53
|
-
|
|
52
|
+
return Arr.map(
|
|
53
|
+
convexLocalStore.getAllQueries(functionReference),
|
|
54
|
+
({ args, value }) => ({
|
|
54
55
|
args: Ref.decodeArgsSync(queryRef, args),
|
|
55
56
|
value:
|
|
56
57
|
value === undefined
|
|
57
58
|
? Option.none()
|
|
58
59
|
: Option.some(Ref.decodeReturnsSync(queryRef, value)),
|
|
59
|
-
})
|
|
60
|
+
}),
|
|
61
|
+
);
|
|
60
62
|
},
|
|
61
63
|
setQuery: (queryRef, args, value) => {
|
|
62
64
|
const functionReference = Ref.getFunctionReference(queryRef);
|
package/src/index.ts
CHANGED
|
@@ -13,6 +13,10 @@ import {
|
|
|
13
13
|
import { getFunctionName, type FunctionReference } from "convex/server";
|
|
14
14
|
import { ConvexError, convexToJson, type Value } from "convex/values";
|
|
15
15
|
import * as Cause from "effect/Cause";
|
|
16
|
+
import * as Array from "effect/Array";
|
|
17
|
+
import * as String from "effect/String";
|
|
18
|
+
import * as Schema from "effect/Schema";
|
|
19
|
+
import { pipe } from "effect/Function";
|
|
16
20
|
import * as Effect from "effect/Effect";
|
|
17
21
|
import * as Result from "effect/Result";
|
|
18
22
|
import * as Exit from "effect/Exit";
|
|
@@ -25,6 +29,11 @@ import * as PaginatedQueryResult from "./PaginatedQueryResult";
|
|
|
25
29
|
import * as QueryResult from "./QueryResult";
|
|
26
30
|
import * as StreamPagination from "./StreamPagination";
|
|
27
31
|
|
|
32
|
+
const encodeJson = Schema.Unknown.pipe(
|
|
33
|
+
Schema.fromJsonString,
|
|
34
|
+
Schema.encodeResult,
|
|
35
|
+
);
|
|
36
|
+
|
|
28
37
|
export {
|
|
29
38
|
OptimisticLocalStore,
|
|
30
39
|
PaginatedQueryResult,
|
|
@@ -180,7 +189,11 @@ const MINIMUM_CONVEX_VERSION = "1.36.0";
|
|
|
180
189
|
* version is the only reliable signal.
|
|
181
190
|
*/
|
|
182
191
|
const supportsErrorsAsValues = ((): boolean => {
|
|
183
|
-
const [major, minor] =
|
|
192
|
+
const [major, minor] = pipe(
|
|
193
|
+
convexVersion,
|
|
194
|
+
String.split("."),
|
|
195
|
+
Array.map(Number),
|
|
196
|
+
);
|
|
184
197
|
if (
|
|
185
198
|
major === undefined ||
|
|
186
199
|
minor === undefined ||
|
|
@@ -189,8 +202,10 @@ const supportsErrorsAsValues = ((): boolean => {
|
|
|
189
202
|
) {
|
|
190
203
|
return false;
|
|
191
204
|
}
|
|
192
|
-
const [minimumMajor, minimumMinor] =
|
|
193
|
-
|
|
205
|
+
const [minimumMajor, minimumMinor] = pipe(
|
|
206
|
+
MINIMUM_CONVEX_VERSION,
|
|
207
|
+
String.split("."),
|
|
208
|
+
Array.map(Number),
|
|
194
209
|
) as [number, number];
|
|
195
210
|
return (
|
|
196
211
|
major > minimumMajor || (major === minimumMajor && minor >= minimumMinor)
|
|
@@ -327,7 +342,7 @@ export const usePaginatedQuery = <Query extends Ref.AnyPublicPaginatedQuery>(
|
|
|
327
342
|
* pagination reset rather than a failure.
|
|
328
343
|
*/
|
|
329
344
|
const isInvalidCursorError = (error: Error): boolean =>
|
|
330
|
-
error.message.includes("InvalidCursor") ||
|
|
345
|
+
pipe(error.message, String.includes("InvalidCursor")) ||
|
|
331
346
|
(error instanceof ConvexError &&
|
|
332
347
|
typeof error.data === "object" &&
|
|
333
348
|
error.data !== null &&
|
|
@@ -398,7 +413,7 @@ export const useStreamPaginatedQuery = <
|
|
|
398
413
|
const encodedArgsKey =
|
|
399
414
|
rawEncodedArgs === undefined
|
|
400
415
|
? "skip"
|
|
401
|
-
:
|
|
416
|
+
: encodeJson(convexToJson(rawEncodedArgs)).pipe(Result.getOrThrow);
|
|
402
417
|
const encodedArgs = useMemo(
|
|
403
418
|
() => rawEncodedArgs,
|
|
404
419
|
// The serialized form stands in for the freshly allocated object.
|
|
@@ -409,13 +424,13 @@ export const useStreamPaginatedQuery = <
|
|
|
409
424
|
// from scratch.
|
|
410
425
|
const resetKey = useMemo(
|
|
411
426
|
() =>
|
|
412
|
-
|
|
427
|
+
encodeJson([
|
|
413
428
|
getFunctionName(functionReference),
|
|
414
429
|
encodedArgsKey,
|
|
415
430
|
options.initialNumItems,
|
|
416
431
|
options.maximumRowsRead ?? null,
|
|
417
432
|
options.maximumBytesRead ?? null,
|
|
418
|
-
]),
|
|
433
|
+
]).pipe(Result.getOrThrow),
|
|
419
434
|
[
|
|
420
435
|
functionReference,
|
|
421
436
|
encodedArgsKey,
|
|
@@ -450,9 +465,8 @@ export const useStreamPaginatedQuery = <
|
|
|
450
465
|
) =>
|
|
451
466
|
setTracked((previous) => ({
|
|
452
467
|
resetKey: previous.resetKey,
|
|
453
|
-
state:
|
|
454
|
-
|
|
455
|
-
previous.state,
|
|
468
|
+
state: Array.reduce(transitions, previous.state, (state, transition) =>
|
|
469
|
+
transition(state),
|
|
456
470
|
),
|
|
457
471
|
})),
|
|
458
472
|
[],
|
|
@@ -508,7 +522,7 @@ export const useStreamPaginatedQuery = <
|
|
|
508
522
|
);
|
|
509
523
|
const decodedResults = useMemo(
|
|
510
524
|
() =>
|
|
511
|
-
|
|
525
|
+
Array.map(encodedItems, (item): PaginatedQueryItem<Query> => {
|
|
512
526
|
if (typeof item !== "object" || item === null) {
|
|
513
527
|
return Ref.decodePaginationPageSync(ref, [
|
|
514
528
|
item,
|