convex 1.36.0 → 1.37.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.
Files changed (240) hide show
  1. package/CHANGELOG.md +50 -27
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/codegen_templates/agentsmd.js +8 -2
  5. package/dist/cjs/cli/codegen_templates/agentsmd.js.map +2 -2
  6. package/dist/cjs/cli/codegen_templates/claudemd.js +2 -0
  7. package/dist/cjs/cli/codegen_templates/claudemd.js.map +2 -2
  8. package/dist/cjs/cli/configure.js +0 -8
  9. package/dist/cjs/cli/configure.js.map +2 -2
  10. package/dist/cjs/cli/deployment.js +2 -1
  11. package/dist/cjs/cli/deployment.js.map +2 -2
  12. package/dist/cjs/cli/deploymentToken.js +30 -0
  13. package/dist/cjs/cli/deploymentToken.js.map +7 -0
  14. package/dist/cjs/cli/deploymentTokenCreate.js +109 -0
  15. package/dist/cjs/cli/deploymentTokenCreate.js.map +7 -0
  16. package/dist/cjs/cli/deploymentTokenDelete.js +87 -0
  17. package/dist/cjs/cli/deploymentTokenDelete.js.map +7 -0
  18. package/dist/cjs/cli/envDefault.js +130 -41
  19. package/dist/cjs/cli/envDefault.js.map +3 -3
  20. package/dist/cjs/cli/generatedApi.js.map +1 -1
  21. package/dist/cjs/cli/lib/command.js +1 -1
  22. package/dist/cjs/cli/lib/command.js.map +1 -1
  23. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  24. package/dist/cjs/cli/lib/login.js +51 -0
  25. package/dist/cjs/cli/lib/login.js.map +3 -3
  26. package/dist/cjs/cli/lib/usage.js +13 -6
  27. package/dist/cjs/cli/lib/usage.js.map +2 -2
  28. package/dist/cjs/cli/lib/workos/environmentApi.js +6 -12
  29. package/dist/cjs/cli/lib/workos/environmentApi.js.map +3 -3
  30. package/dist/cjs/index.js +1 -1
  31. package/dist/cjs/index.js.map +1 -1
  32. package/dist/cjs/react/client.js +40 -42
  33. package/dist/cjs/react/client.js.map +2 -2
  34. package/dist/cjs/react/index.js +1 -0
  35. package/dist/cjs/react/index.js.map +2 -2
  36. package/dist/cjs/react/use_paginated_query.js +5 -46
  37. package/dist/cjs/react/use_paginated_query.js.map +2 -2
  38. package/dist/cjs/react/use_paginated_query2.js.map +2 -2
  39. package/dist/cjs/server/audit_logging.js +67 -0
  40. package/dist/cjs/server/audit_logging.js.map +7 -0
  41. package/dist/cjs/server/impl/meta_impl.js +27 -3
  42. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  43. package/dist/cjs/server/impl/registration_impl.js +2 -0
  44. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  45. package/dist/cjs/server/index.js +2 -0
  46. package/dist/cjs/server/index.js.map +2 -2
  47. package/dist/cjs/server/log.js +30 -0
  48. package/dist/cjs/server/log.js.map +7 -0
  49. package/dist/cjs/server/logVars.js +48 -0
  50. package/dist/cjs/server/logVars.js.map +7 -0
  51. package/dist/cjs/server/meta.js.map +1 -1
  52. package/dist/cjs/server/registration.js.map +1 -1
  53. package/dist/cjs-types/cli/codegen_templates/agentsmd.d.ts.map +1 -1
  54. package/dist/cjs-types/cli/codegen_templates/claudemd.d.ts.map +1 -1
  55. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  56. package/dist/cjs-types/cli/deployment.d.ts.map +1 -1
  57. package/dist/cjs-types/cli/deploymentToken.d.ts +3 -0
  58. package/dist/cjs-types/cli/deploymentToken.d.ts.map +1 -0
  59. package/dist/cjs-types/cli/deploymentToken.test.d.ts +2 -0
  60. package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +1 -0
  61. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts +13 -0
  62. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -0
  63. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts +11 -0
  64. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -0
  65. package/dist/cjs-types/cli/envDefault.d.ts +2 -2
  66. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  67. package/dist/cjs-types/cli/envDefault.test.d.ts +2 -0
  68. package/dist/cjs-types/cli/envDefault.test.d.ts.map +1 -0
  69. package/dist/cjs-types/cli/generatedApi.d.ts +1 -1
  70. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  71. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +1 -0
  72. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  73. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  74. package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
  75. package/dist/cjs-types/cli/lib/workos/environmentApi.d.ts.map +1 -1
  76. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +2 -0
  77. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +1 -0
  78. package/dist/cjs-types/index.d.ts +1 -1
  79. package/dist/cjs-types/react/client.d.ts +52 -0
  80. package/dist/cjs-types/react/client.d.ts.map +1 -1
  81. package/dist/cjs-types/react/index.d.ts +2 -2
  82. package/dist/cjs-types/react/index.d.ts.map +1 -1
  83. package/dist/cjs-types/react/use_paginated_query.d.ts.map +1 -1
  84. package/dist/cjs-types/react/use_paginated_query2.d.ts +63 -1
  85. package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
  86. package/dist/cjs-types/server/api.intersect.test.d.ts +2 -0
  87. package/dist/cjs-types/server/api.intersect.test.d.ts.map +1 -0
  88. package/dist/cjs-types/server/audit_logging.d.ts +19 -0
  89. package/dist/cjs-types/server/audit_logging.d.ts.map +1 -0
  90. package/dist/cjs-types/server/audit_logging.test.d.ts +2 -0
  91. package/dist/cjs-types/server/audit_logging.test.d.ts.map +1 -0
  92. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  93. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  94. package/dist/cjs-types/server/index.d.ts +2 -2
  95. package/dist/cjs-types/server/index.d.ts.map +1 -1
  96. package/dist/cjs-types/server/log.d.ts +2 -0
  97. package/dist/cjs-types/server/log.d.ts.map +1 -0
  98. package/dist/cjs-types/server/logVars.d.ts +20 -0
  99. package/dist/cjs-types/server/logVars.d.ts.map +1 -0
  100. package/dist/cjs-types/server/meta.d.ts +40 -0
  101. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  102. package/dist/cjs-types/server/registration.d.ts +5 -2
  103. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  104. package/dist/cli.bundle.cjs +362 -74
  105. package/dist/cli.bundle.cjs.map +4 -4
  106. package/dist/esm/cli/codegen_templates/agentsmd.js +8 -2
  107. package/dist/esm/cli/codegen_templates/agentsmd.js.map +2 -2
  108. package/dist/esm/cli/codegen_templates/claudemd.js +2 -0
  109. package/dist/esm/cli/codegen_templates/claudemd.js.map +2 -2
  110. package/dist/esm/cli/configure.js +0 -8
  111. package/dist/esm/cli/configure.js.map +2 -2
  112. package/dist/esm/cli/deployment.js +2 -1
  113. package/dist/esm/cli/deployment.js.map +2 -2
  114. package/dist/esm/cli/deploymentToken.js +8 -0
  115. package/dist/esm/cli/deploymentToken.js.map +7 -0
  116. package/dist/esm/cli/deploymentTokenCreate.js +91 -0
  117. package/dist/esm/cli/deploymentTokenCreate.js.map +7 -0
  118. package/dist/esm/cli/deploymentTokenDelete.js +68 -0
  119. package/dist/esm/cli/deploymentTokenDelete.js.map +7 -0
  120. package/dist/esm/cli/envDefault.js +131 -42
  121. package/dist/esm/cli/envDefault.js.map +3 -3
  122. package/dist/esm/cli/lib/command.js +1 -1
  123. package/dist/esm/cli/lib/command.js.map +1 -1
  124. package/dist/esm/cli/lib/login.js +52 -0
  125. package/dist/esm/cli/lib/login.js.map +3 -3
  126. package/dist/esm/cli/lib/usage.js +15 -8
  127. package/dist/esm/cli/lib/usage.js.map +2 -2
  128. package/dist/esm/cli/lib/workos/environmentApi.js +6 -12
  129. package/dist/esm/cli/lib/workos/environmentApi.js.map +3 -3
  130. package/dist/esm/index.js +1 -1
  131. package/dist/esm/index.js.map +1 -1
  132. package/dist/esm/react/client.js +38 -41
  133. package/dist/esm/react/client.js.map +2 -2
  134. package/dist/esm/react/index.js +4 -1
  135. package/dist/esm/react/index.js.map +2 -2
  136. package/dist/esm/react/use_paginated_query.js +5 -46
  137. package/dist/esm/react/use_paginated_query.js.map +2 -2
  138. package/dist/esm/react/use_paginated_query2.js.map +2 -2
  139. package/dist/esm/server/audit_logging.js +44 -0
  140. package/dist/esm/server/audit_logging.js.map +7 -0
  141. package/dist/esm/server/impl/meta_impl.js +27 -3
  142. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  143. package/dist/esm/server/impl/registration_impl.js +2 -0
  144. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  145. package/dist/esm/server/index.js +1 -0
  146. package/dist/esm/server/index.js.map +2 -2
  147. package/dist/esm/server/log.js +8 -0
  148. package/dist/esm/server/log.js.map +7 -0
  149. package/dist/esm/server/logVars.js +25 -0
  150. package/dist/esm/server/logVars.js.map +7 -0
  151. package/dist/esm-types/cli/codegen_templates/agentsmd.d.ts.map +1 -1
  152. package/dist/esm-types/cli/codegen_templates/claudemd.d.ts.map +1 -1
  153. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  154. package/dist/esm-types/cli/deployment.d.ts.map +1 -1
  155. package/dist/esm-types/cli/deploymentToken.d.ts +3 -0
  156. package/dist/esm-types/cli/deploymentToken.d.ts.map +1 -0
  157. package/dist/esm-types/cli/deploymentToken.test.d.ts +2 -0
  158. package/dist/esm-types/cli/deploymentToken.test.d.ts.map +1 -0
  159. package/dist/esm-types/cli/deploymentTokenCreate.d.ts +13 -0
  160. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -0
  161. package/dist/esm-types/cli/deploymentTokenDelete.d.ts +11 -0
  162. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -0
  163. package/dist/esm-types/cli/envDefault.d.ts +2 -2
  164. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  165. package/dist/esm-types/cli/envDefault.test.d.ts +2 -0
  166. package/dist/esm-types/cli/envDefault.test.d.ts.map +1 -0
  167. package/dist/esm-types/cli/generatedApi.d.ts +1 -1
  168. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  169. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +1 -0
  170. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  171. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  172. package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
  173. package/dist/esm-types/cli/lib/workos/environmentApi.d.ts.map +1 -1
  174. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +2 -0
  175. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +1 -0
  176. package/dist/esm-types/index.d.ts +1 -1
  177. package/dist/esm-types/react/client.d.ts +52 -0
  178. package/dist/esm-types/react/client.d.ts.map +1 -1
  179. package/dist/esm-types/react/index.d.ts +2 -2
  180. package/dist/esm-types/react/index.d.ts.map +1 -1
  181. package/dist/esm-types/react/use_paginated_query.d.ts.map +1 -1
  182. package/dist/esm-types/react/use_paginated_query2.d.ts +63 -1
  183. package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
  184. package/dist/esm-types/server/api.intersect.test.d.ts +2 -0
  185. package/dist/esm-types/server/api.intersect.test.d.ts.map +1 -0
  186. package/dist/esm-types/server/audit_logging.d.ts +19 -0
  187. package/dist/esm-types/server/audit_logging.d.ts.map +1 -0
  188. package/dist/esm-types/server/audit_logging.test.d.ts +2 -0
  189. package/dist/esm-types/server/audit_logging.test.d.ts.map +1 -0
  190. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  191. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  192. package/dist/esm-types/server/index.d.ts +2 -2
  193. package/dist/esm-types/server/index.d.ts.map +1 -1
  194. package/dist/esm-types/server/log.d.ts +2 -0
  195. package/dist/esm-types/server/log.d.ts.map +1 -0
  196. package/dist/esm-types/server/logVars.d.ts +20 -0
  197. package/dist/esm-types/server/logVars.d.ts.map +1 -0
  198. package/dist/esm-types/server/meta.d.ts +40 -0
  199. package/dist/esm-types/server/meta.d.ts.map +1 -1
  200. package/dist/esm-types/server/registration.d.ts +5 -2
  201. package/dist/esm-types/server/registration.d.ts.map +1 -1
  202. package/dist/react.bundle.js +45 -88
  203. package/dist/react.bundle.js.map +2 -2
  204. package/package.json +4 -4
  205. package/src/cli/codegen_templates/agentsmd.ts +8 -2
  206. package/src/cli/codegen_templates/claudemd.ts +2 -0
  207. package/src/cli/configure.ts +0 -9
  208. package/src/cli/deployment.ts +3 -1
  209. package/src/cli/deploymentToken.test.ts +372 -0
  210. package/src/cli/deploymentToken.ts +11 -0
  211. package/src/cli/deploymentTokenCreate.ts +113 -0
  212. package/src/cli/deploymentTokenDelete.ts +91 -0
  213. package/src/cli/envDefault.test.ts +495 -0
  214. package/src/cli/envDefault.ts +222 -107
  215. package/src/cli/generatedApi.ts +1 -1
  216. package/src/cli/lib/command.ts +1 -1
  217. package/src/cli/lib/generatedFunctionLogsApi.ts +1 -0
  218. package/src/cli/lib/login.ts +67 -0
  219. package/src/cli/lib/usage.ts +18 -8
  220. package/src/cli/lib/workos/environmentApi.test.ts +107 -0
  221. package/src/cli/lib/workos/environmentApi.ts +12 -19
  222. package/src/index.ts +1 -1
  223. package/src/react/client.test.tsx +10 -8
  224. package/src/react/client.ts +88 -96
  225. package/src/react/index.ts +6 -1
  226. package/src/react/use_paginated_query.test.tsx +215 -132
  227. package/src/react/use_paginated_query.ts +8 -142
  228. package/src/react/use_paginated_query2.ts +78 -5
  229. package/src/react/use_query_object_options.test.ts +8 -7
  230. package/src/react/use_query_result.test.ts +40 -7
  231. package/src/server/api.intersect.test.ts +109 -0
  232. package/src/server/audit_logging.test.ts +129 -0
  233. package/src/server/audit_logging.ts +75 -0
  234. package/src/server/impl/meta_impl.ts +28 -0
  235. package/src/server/impl/registration_impl.ts +2 -0
  236. package/src/server/index.ts +12 -0
  237. package/src/server/log.ts +16 -0
  238. package/src/server/logVars.ts +34 -0
  239. package/src/server/meta.ts +53 -1
  240. package/src/server/registration.ts +10 -8
@@ -35,15 +35,11 @@ export async function createRedirectURI(
35
35
  );
36
36
 
37
37
  if (!response.ok) {
38
- if (response.status === 422) {
39
- const errorText = await response.text();
40
- if (errorText.includes("already exists")) {
41
- // This redirect URI already exists.
42
- return { modified: false };
43
- }
44
- }
45
-
46
38
  const errorText = await response.text();
39
+ if (response.status === 422 && errorText.includes("already exists")) {
40
+ // This redirect URI already exists.
41
+ return { modified: false };
42
+ }
47
43
  return await ctx.crash({
48
44
  exitCode: 1,
49
45
  errorType: "fatal",
@@ -109,18 +105,15 @@ export async function createCORSOrigin(
109
105
  );
110
106
 
111
107
  if (!response.ok) {
112
- if (response.status === 409) {
113
- const errorText = await response.text();
114
- if (
115
- errorText.includes("duplicate_cors_origin") ||
116
- errorText.includes("already exists")
117
- ) {
118
- // This CORS origin already exists.
119
- return { modified: false };
120
- }
121
- }
122
-
123
108
  const errorText = await response.text();
109
+ if (
110
+ response.status === 409 &&
111
+ (errorText.includes("duplicate_cors_origin") ||
112
+ errorText.includes("already exists"))
113
+ ) {
114
+ // This CORS origin already exists.
115
+ return { modified: false };
116
+ }
124
117
  return await ctx.crash({
125
118
  exitCode: 1,
126
119
  errorType: "fatal",
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export const version = "1.36.0";
1
+ export const version = "1.37.0";
@@ -4,7 +4,12 @@
4
4
  import { test, expect, describe, vi } from "vitest";
5
5
  import ws from "ws";
6
6
 
7
- import { ConvexReactClient, createMutation, useQuery } from "./client.js";
7
+ import {
8
+ ConvexReactClient,
9
+ createMutation,
10
+ useQuery,
11
+ useQuery_experimental,
12
+ } from "./client.js";
8
13
  import { convexQueryOptions } from "../browser/query_options.js";
9
14
  import { ConvexProvider } from "./index.js";
10
15
  import React from "react";
@@ -114,14 +119,14 @@ describe("useQuery", () => {
114
119
  expect(result.current).toStrictEqual(undefined);
115
120
  });
116
121
 
117
- test("object form returns success result", () => {
122
+ test("useQuery_experimental object form returns success result", () => {
118
123
  const client = createClientWithQuery();
119
124
  const wrapper = ({ children }: any) => (
120
125
  <ConvexProvider client={client}>{children}</ConvexProvider>
121
126
  );
122
127
  const { result } = renderHook(
123
128
  () =>
124
- useQuery({
129
+ useQuery_experimental({
125
130
  query: anyApi.myQuery.default,
126
131
  args: {},
127
132
  }),
@@ -129,27 +134,24 @@ describe("useQuery", () => {
129
134
  );
130
135
  expect(result.current).toStrictEqual({
131
136
  data: "queryResult",
132
- error: undefined,
133
137
  status: "success",
134
138
  });
135
139
  });
136
140
 
137
- test("object form returns pending when skipped", () => {
141
+ test("useQuery_experimental object form returns pending when skipped", () => {
138
142
  const client = createClientWithQuery();
139
143
  const wrapper = ({ children }: any) => (
140
144
  <ConvexProvider client={client}>{children}</ConvexProvider>
141
145
  );
142
146
  const { result } = renderHook(
143
147
  () =>
144
- useQuery({
148
+ useQuery_experimental({
145
149
  query: anyApi.myQuery.default,
146
150
  args: "skip",
147
151
  }),
148
152
  { wrapper },
149
153
  );
150
154
  expect(result.current).toStrictEqual({
151
- data: undefined,
152
- error: undefined,
153
155
  status: "pending",
154
156
  });
155
157
  });
@@ -800,31 +800,22 @@ export type OptionalRestArgsOrSkip<FuncRef extends FunctionReference<any>> =
800
800
  : [args: FuncRef["_args"] | "skip"];
801
801
 
802
802
  /**
803
- * Result returned by object-form {@link useQuery}.
803
+ * Result returned by object-form {@link useQuery_experimental}.
804
804
  *
805
- * @internal
805
+ * @public
806
806
  */
807
- export type UseQueryResult<QueryResult> =
808
- | {
809
- data: QueryResult;
810
- error: undefined;
811
- status: "success";
812
- }
813
- | {
814
- data: undefined;
815
- error: Error;
816
- status: "error";
817
- }
818
- | {
819
- data: undefined;
820
- error: undefined;
821
- status: "pending";
822
- };
823
-
824
- type UseQueryOptions<Query extends FunctionReference<"query">> = {
807
+ export type UseQueryResult<QueryResult, ThrowOnError extends boolean = false> =
808
+ | { status: "pending" }
809
+ | { status: "success"; data: QueryResult }
810
+ | (ThrowOnError extends true ? never : { status: "error"; error: Error });
811
+
812
+ type UseQueryOptions<
813
+ Query extends FunctionReference<"query">,
814
+ ThrowOnError extends boolean,
815
+ > = {
825
816
  query: Query;
826
817
  args: FunctionArgs<Query> | "skip";
827
- throwOnError?: boolean;
818
+ throwOnError?: ThrowOnError;
828
819
  };
829
820
 
830
821
  /**
@@ -873,18 +864,50 @@ type UseQueryOptions<Query extends FunctionReference<"query">> = {
873
864
  export function useQuery<Query extends FunctionReference<"query">>(
874
865
  query: Query,
875
866
  ...args: OptionalRestArgsOrSkip<Query>
876
- ): Query["_returnType"] | undefined;
867
+ ): Query["_returnType"] | undefined {
868
+ const skip = args[0] === "skip";
869
+ const argsObject = args[0] === "skip" ? {} : parseArgs(args[0]);
870
+ const queryReference =
871
+ typeof query === "string"
872
+ ? makeFunctionReference<"query", any, any>(query)
873
+ : query;
874
+
875
+ const queryName = getFunctionName(queryReference);
876
+
877
+ const queries = useMemo(
878
+ () =>
879
+ skip
880
+ ? ({} as RequestForQueries)
881
+ : { query: { query: queryReference, args: argsObject } },
882
+ // Stringify args so args that are semantically the same don't trigger a
883
+ // rerender. Saves developers from adding `useMemo` on every args usage.
884
+ // eslint-disable-next-line react-hooks/exhaustive-deps
885
+ [JSON.stringify(convexToJson(argsObject)), queryName, skip],
886
+ );
887
+
888
+ const results = useQueries(queries);
889
+ const result = results["query"];
890
+
891
+ if (result instanceof Error) {
892
+ throw result;
893
+ }
894
+ return result;
895
+ }
877
896
 
878
897
  /**
879
898
  * Load a reactive query within a React component using an options object.
880
899
  *
881
- * This is an alternative form of {@link useQuery} that accepts a single
900
+ * This is an experimental form of {@link useQuery} that accepts a single
882
901
  * {@link UseQueryOptions} object instead of positional arguments.
883
- * Errors are returned in the result object unless `throwOnError` is set.
902
+ *
903
+ * Consumers are expected to check the returned object `status` field to
904
+ * make proper use of the result. If an error occurs, it will be present
905
+ * in the result object unless `throwOnError` is `true`, in which case
906
+ * the error will be thrown instead.
884
907
  *
885
908
  * @example
886
909
  * ```tsx
887
- * import { useQuery } from "convex/react";
910
+ * import { useQuery_experimental as useQuery } from "convex/react";
888
911
  * import { api } from "../convex/_generated/api";
889
912
  *
890
913
  * function TaskList() {
@@ -900,55 +923,35 @@ export function useQuery<Query extends FunctionReference<"query">>(
900
923
  * @returns the current query state as a {@link UseQueryResult} object.
901
924
  *
902
925
  * @see https://docs.convex.dev/client/react#fetching-data
903
- * @internal
926
+ * @public
904
927
  */
905
- export function useQuery<Query extends FunctionReference<"query">>(
906
- options: UseQueryOptions<Query>,
907
- ): UseQueryResult<Query["_returnType"]>;
908
-
909
- export function useQuery<Query extends FunctionReference<"query">>(
910
- queryOrOptions: Query | UseQueryOptions<Query>,
911
- ...args: OptionalRestArgsOrSkip<Query>
912
- ): Query["_returnType"] | undefined | UseQueryResult<Query["_returnType"]> {
913
- const isObjectOptions =
914
- typeof queryOrOptions === "object" &&
915
- queryOrOptions !== null &&
916
- "query" in queryOrOptions;
917
- const throwOnError = isObjectOptions
918
- ? (queryOrOptions.throwOnError ?? false)
919
- : true;
920
-
921
- let queryReference: Query | undefined;
922
- let argsObject: Record<string, Value> = {};
923
-
924
- if (isObjectOptions) {
925
- const query = queryOrOptions.query;
926
- queryReference =
927
- typeof query === "string"
928
- ? (makeFunctionReference<"query", any, any>(query) as Query)
929
- : query;
930
- if (queryOrOptions.args !== "skip") {
931
- argsObject = parseArgs(queryOrOptions.args as Record<string, Value>);
932
- }
933
- } else {
934
- const query = queryOrOptions;
935
- queryReference =
936
- typeof query === "string"
937
- ? (makeFunctionReference<"query", any, any>(query) as Query)
938
- : query;
939
- argsObject = args[0] === "skip" ? {} : parseArgs(args[0] as Query["_args"]);
940
- }
941
-
942
- const queryName = queryReference
943
- ? getFunctionName(queryReference)
944
- : undefined;
945
- const skip =
946
- (isObjectOptions && queryOrOptions.args === "skip") ||
947
- (!isObjectOptions && args[0] === "skip");
948
-
928
+ export function useQuery_experimental<
929
+ Query extends FunctionReference<"query">,
930
+ ThrowOnError extends boolean = false,
931
+ >(
932
+ options: UseQueryOptions<Query, ThrowOnError>,
933
+ ): UseQueryResult<Query["_returnType"], ThrowOnError>;
934
+
935
+ export function useQuery_experimental<
936
+ Query extends FunctionReference<"query">,
937
+ ThrowOnError extends boolean = false,
938
+ >(
939
+ options: UseQueryOptions<Query, ThrowOnError>,
940
+ ): UseQueryResult<Query["_returnType"], false> {
941
+ const throwOnError = options.throwOnError ?? false;
942
+ const queryReference =
943
+ typeof options.query === "string"
944
+ ? (makeFunctionReference<"query", any, any>(options.query) as Query)
945
+ : options.query;
946
+ const skip = options.args === "skip";
947
+ const argsObject = !skip
948
+ ? parseArgs(options.args as Record<string, Value>)
949
+ : {};
950
+
951
+ const queryName = getFunctionName(queryReference);
949
952
  const queries = useMemo(
950
953
  () =>
951
- skip || !queryReference
954
+ skip
952
955
  ? ({} as RequestForQueries)
953
956
  : { query: { query: queryReference, args: argsObject } },
954
957
  // Stringify args so args that are semantically the same don't trigger a
@@ -960,37 +963,26 @@ export function useQuery<Query extends FunctionReference<"query">>(
960
963
  const results = useQueries(queries);
961
964
  const result = results["query"];
962
965
 
963
- if (isObjectOptions) {
964
- if (result instanceof Error) {
965
- if (throwOnError) {
966
- throw result;
967
- }
968
- return {
969
- data: undefined,
970
- error: result,
971
- status: "error",
972
- };
973
- }
974
-
975
- if (result === undefined) {
976
- return {
977
- data: undefined,
978
- error: undefined,
979
- status: "pending",
980
- };
966
+ if (result instanceof Error) {
967
+ if (throwOnError) {
968
+ throw result;
981
969
  }
982
-
983
970
  return {
984
- data: result,
985
- error: undefined,
986
- status: "success",
971
+ error: result,
972
+ status: "error",
987
973
  };
988
974
  }
989
975
 
990
- if (result instanceof Error) {
991
- throw result;
976
+ if (result === undefined) {
977
+ return {
978
+ status: "pending",
979
+ };
992
980
  }
993
- return result;
981
+
982
+ return {
983
+ data: result,
984
+ status: "success",
985
+ };
994
986
  }
995
987
 
996
988
  /**
@@ -61,7 +61,11 @@
61
61
  * @module
62
62
  */
63
63
  export * from "./use_paginated_query.js";
64
- export { usePaginatedQuery_experimental } from "./use_paginated_query2.js";
64
+ export {
65
+ usePaginatedQuery_experimental,
66
+ type UsePaginatedQueryOptions,
67
+ type UsePaginatedQueryObjectReturnType,
68
+ } from "./use_paginated_query2.js";
65
69
  export { usePaginatedQuery } from "./use_paginated_query.js";
66
70
  export { useQueries, type RequestForQueries } from "./use_queries.js";
67
71
  export type { AuthTokenFetcher } from "../browser/sync/client.js";
@@ -82,6 +86,7 @@ export {
82
86
  useConvex,
83
87
  ConvexProvider,
84
88
  useQuery,
89
+ useQuery_experimental,
85
90
  useMutation,
86
91
  useAction,
87
92
  useConvexConnectionState,