convex 1.44.0 → 1.45.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 (594) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/cli/convexExport.js +1 -1
  5. package/dist/cjs/cli/convexExport.js.map +1 -1
  6. package/dist/cjs/cli/index.js +2 -32
  7. package/dist/cjs/cli/index.js.map +2 -2
  8. package/dist/cjs/cli/lib/api.js +11 -5
  9. package/dist/cjs/cli/lib/api.js.map +2 -2
  10. package/dist/cjs/cli/lib/convexExport.js +12 -1
  11. package/dist/cjs/cli/lib/convexExport.js.map +2 -2
  12. package/dist/cjs/cli/lib/dashboard.js.map +2 -2
  13. package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
  14. package/dist/cjs/cli/lib/indexes.js +1 -1
  15. package/dist/cjs/cli/lib/indexes.js.map +1 -1
  16. package/dist/cjs/cli/lib/localDeployment/upgrade.js +23 -188
  17. package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
  18. package/dist/cjs/cli/lib/mcp/tools/index.js.map +1 -1
  19. package/dist/cjs/cli/mcp.js +76 -69
  20. package/dist/cjs/cli/mcp.js.map +2 -2
  21. package/dist/cjs/index.js +1 -1
  22. package/dist/cjs/index.js.map +1 -1
  23. package/dist/cjs/server/impl/actions_impl.js.map +2 -2
  24. package/dist/cjs/server/index.js.map +2 -2
  25. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  26. package/dist/cjs-types/cli/lib/convexExport.d.ts +1 -0
  27. package/dist/cjs-types/cli/lib/convexExport.d.ts.map +1 -1
  28. package/dist/cjs-types/cli/lib/dashboard.d.ts.map +1 -1
  29. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  30. package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  31. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
  32. package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  33. package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts +1 -1
  34. package/dist/cjs-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
  35. package/dist/cjs-types/cli/mcp.d.ts +3 -0
  36. package/dist/cjs-types/cli/mcp.d.ts.map +1 -1
  37. package/dist/cjs-types/index.d.ts +1 -1
  38. package/dist/cjs-types/server/impl/actions_impl.d.ts +14 -0
  39. package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
  40. package/dist/cjs-types/server/index.d.ts +1 -0
  41. package/dist/cjs-types/server/index.d.ts.map +1 -1
  42. package/dist/cli.bundle.cjs +31210 -25495
  43. package/dist/cli.bundle.cjs.map +4 -4
  44. package/dist/esm/cli/convexExport.js +1 -1
  45. package/dist/esm/cli/convexExport.js.map +1 -1
  46. package/dist/esm/cli/index.js +2 -32
  47. package/dist/esm/cli/index.js.map +2 -2
  48. package/dist/esm/cli/lib/api.js +11 -5
  49. package/dist/esm/cli/lib/api.js.map +2 -2
  50. package/dist/esm/cli/lib/convexExport.js +16 -3
  51. package/dist/esm/cli/lib/convexExport.js.map +2 -2
  52. package/dist/esm/cli/lib/dashboard.js.map +2 -2
  53. package/dist/esm/cli/lib/indexes.js +1 -1
  54. package/dist/esm/cli/lib/indexes.js.map +1 -1
  55. package/dist/esm/cli/lib/localDeployment/upgrade.js +22 -190
  56. package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
  57. package/dist/esm/cli/lib/mcp/tools/index.js.map +1 -1
  58. package/dist/esm/cli/mcp.js +75 -72
  59. package/dist/esm/cli/mcp.js.map +2 -2
  60. package/dist/esm/index.js +1 -1
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/server/impl/actions_impl.js.map +2 -2
  63. package/dist/esm/server/index.js.map +2 -2
  64. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  65. package/dist/esm-types/cli/lib/convexExport.d.ts +1 -0
  66. package/dist/esm-types/cli/lib/convexExport.d.ts.map +1 -1
  67. package/dist/esm-types/cli/lib/dashboard.d.ts.map +1 -1
  68. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
  69. package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
  70. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +2 -0
  71. package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
  72. package/dist/esm-types/cli/lib/mcp/tools/index.d.ts +1 -1
  73. package/dist/esm-types/cli/lib/mcp/tools/index.d.ts.map +1 -1
  74. package/dist/esm-types/cli/mcp.d.ts +3 -0
  75. package/dist/esm-types/cli/mcp.d.ts.map +1 -1
  76. package/dist/esm-types/index.d.ts +1 -1
  77. package/dist/esm-types/server/impl/actions_impl.d.ts +14 -0
  78. package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
  79. package/dist/esm-types/server/index.d.ts +1 -0
  80. package/dist/esm-types/server/index.d.ts.map +1 -1
  81. package/dist/react.bundle.js +1 -1
  82. package/dist/react.bundle.js.map +1 -1
  83. package/package.json +3 -3
  84. package/src/cli/convexExport.ts +1 -1
  85. package/src/cli/index.ts +2 -35
  86. package/src/cli/lib/api.ts +11 -5
  87. package/src/cli/lib/convexExport.ts +21 -0
  88. package/src/cli/lib/dashboard.ts +2 -0
  89. package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
  90. package/src/cli/lib/indexes.ts +1 -1
  91. package/src/cli/lib/localDeployment/upgrade.ts +34 -207
  92. package/src/cli/lib/mcp/tools/index.ts +1 -1
  93. package/src/cli/mcp.ts +91 -77
  94. package/src/index.ts +1 -1
  95. package/src/server/impl/actions_impl.ts +3 -1
  96. package/src/server/index.ts +0 -3
  97. package/dist/cjs-types/browser/http_client.test.d.ts +0 -2
  98. package/dist/cjs-types/browser/http_client.test.d.ts.map +0 -1
  99. package/dist/cjs-types/browser/query_options.test.d.ts +0 -2
  100. package/dist/cjs-types/browser/query_options.test.d.ts.map +0 -1
  101. package/dist/cjs-types/browser/simple_client.test.d.ts +0 -2
  102. package/dist/cjs-types/browser/simple_client.test.d.ts.map +0 -1
  103. package/dist/cjs-types/browser/sync/client.test.d.ts +0 -5
  104. package/dist/cjs-types/browser/sync/client.test.d.ts.map +0 -1
  105. package/dist/cjs-types/browser/sync/client_node.test.d.ts +0 -2
  106. package/dist/cjs-types/browser/sync/client_node.test.d.ts.map +0 -1
  107. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts +0 -44
  108. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
  109. package/dist/cjs-types/browser/sync/local_state.test.d.ts +0 -2
  110. package/dist/cjs-types/browser/sync/local_state.test.d.ts.map +0 -1
  111. package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
  112. package/dist/cjs-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
  113. package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts +0 -2
  114. package/dist/cjs-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
  115. package/dist/cjs-types/browser/sync/protocol.test.d.ts +0 -5
  116. package/dist/cjs-types/browser/sync/protocol.test.d.ts.map +0 -1
  117. package/dist/cjs-types/browser/sync/request_manager.test.d.ts +0 -2
  118. package/dist/cjs-types/browser/sync/request_manager.test.d.ts.map +0 -1
  119. package/dist/cjs-types/bundler/fs.test.d.ts +0 -2
  120. package/dist/cjs-types/bundler/fs.test.d.ts.map +0 -1
  121. package/dist/cjs-types/bundler/index.test.d.ts +0 -2
  122. package/dist/cjs-types/bundler/index.test.d.ts.map +0 -1
  123. package/dist/cjs-types/cli/codegen_templates/api.test.d.ts +0 -2
  124. package/dist/cjs-types/cli/codegen_templates/api.test.d.ts.map +0 -1
  125. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +0 -2
  126. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +0 -1
  127. package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts +0 -2
  128. package/dist/cjs-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
  129. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
  130. package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
  131. package/dist/cjs-types/cli/configure.test.d.ts +0 -2
  132. package/dist/cjs-types/cli/configure.test.d.ts.map +0 -1
  133. package/dist/cjs-types/cli/deploymentCreate.test.d.ts +0 -2
  134. package/dist/cjs-types/cli/deploymentCreate.test.d.ts.map +0 -1
  135. package/dist/cjs-types/cli/deploymentSelect.test.d.ts +0 -2
  136. package/dist/cjs-types/cli/deploymentSelect.test.d.ts.map +0 -1
  137. package/dist/cjs-types/cli/deploymentSelection.test.d.ts +0 -2
  138. package/dist/cjs-types/cli/deploymentSelection.test.d.ts.map +0 -1
  139. package/dist/cjs-types/cli/deploymentToken.test.d.ts +0 -2
  140. package/dist/cjs-types/cli/deploymentToken.test.d.ts.map +0 -1
  141. package/dist/cjs-types/cli/dev.test.d.ts +0 -2
  142. package/dist/cjs-types/cli/dev.test.d.ts.map +0 -1
  143. package/dist/cjs-types/cli/envDefault.test.d.ts +0 -2
  144. package/dist/cjs-types/cli/envDefault.test.d.ts.map +0 -1
  145. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
  146. package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
  147. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
  148. package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
  149. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
  150. package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
  151. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts +0 -2
  152. package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
  153. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
  154. package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
  155. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
  156. package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
  157. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +0 -2
  158. package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
  159. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
  160. package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
  161. package/dist/cjs-types/cli/lib/codegen.test.d.ts +0 -2
  162. package/dist/cjs-types/cli/lib/codegen.test.d.ts.map +0 -1
  163. package/dist/cjs-types/cli/lib/components.test.d.ts +0 -2
  164. package/dist/cjs-types/cli/lib/components.test.d.ts.map +0 -1
  165. package/dist/cjs-types/cli/lib/config.test.d.ts +0 -2
  166. package/dist/cjs-types/cli/lib/config.test.d.ts.map +0 -1
  167. package/dist/cjs-types/cli/lib/deployment.test.d.ts +0 -2
  168. package/dist/cjs-types/cli/lib/deployment.test.d.ts.map +0 -1
  169. package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts +0 -2
  170. package/dist/cjs-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
  171. package/dist/cjs-types/cli/lib/env.test.d.ts +0 -2
  172. package/dist/cjs-types/cli/lib/env.test.d.ts.map +0 -1
  173. package/dist/cjs-types/cli/lib/expiration.test.d.ts +0 -2
  174. package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +0 -1
  175. package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
  176. package/dist/cjs-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
  177. package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
  178. package/dist/cjs-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
  179. package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
  180. package/dist/cjs-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
  181. package/dist/cjs-types/cli/lib/fsUtils.test.d.ts +0 -2
  182. package/dist/cjs-types/cli/lib/fsUtils.test.d.ts.map +0 -1
  183. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +0 -2
  184. package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +0 -1
  185. package/dist/cjs-types/cli/lib/indexes.test.d.ts +0 -2
  186. package/dist/cjs-types/cli/lib/indexes.test.d.ts.map +0 -1
  187. package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts +0 -2
  188. package/dist/cjs-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
  189. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
  190. package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
  191. package/dist/cjs-types/cli/lib/run.test.d.ts +0 -2
  192. package/dist/cjs-types/cli/lib/run.test.d.ts.map +0 -1
  193. package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts +0 -2
  194. package/dist/cjs-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
  195. package/dist/cjs-types/cli/lib/typecheck.test.d.ts +0 -2
  196. package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +0 -1
  197. package/dist/cjs-types/cli/lib/updates.test.d.ts +0 -2
  198. package/dist/cjs-types/cli/lib/updates.test.d.ts.map +0 -1
  199. package/dist/cjs-types/cli/lib/utils/hash.test.d.ts +0 -2
  200. package/dist/cjs-types/cli/lib/utils/hash.test.d.ts.map +0 -1
  201. package/dist/cjs-types/cli/lib/utils/utils.test.d.ts +0 -2
  202. package/dist/cjs-types/cli/lib/utils/utils.test.d.ts.map +0 -1
  203. package/dist/cjs-types/cli/lib/versionApi.test.d.ts +0 -2
  204. package/dist/cjs-types/cli/lib/versionApi.test.d.ts.map +0 -1
  205. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
  206. package/dist/cjs-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
  207. package/dist/cjs-types/cli/lib/workos/workos.test.d.ts +0 -2
  208. package/dist/cjs-types/cli/lib/workos/workos.test.d.ts.map +0 -1
  209. package/dist/cjs-types/cli/login.test.d.ts +0 -2
  210. package/dist/cjs-types/cli/login.test.d.ts.map +0 -1
  211. package/dist/cjs-types/common/index.test.d.ts +0 -2
  212. package/dist/cjs-types/common/index.test.d.ts.map +0 -1
  213. package/dist/cjs-types/nextjs/nextjs.test.d.ts +0 -2
  214. package/dist/cjs-types/nextjs/nextjs.test.d.ts.map +0 -1
  215. package/dist/cjs-types/react/ConvexAuthState.test.d.ts +0 -2
  216. package/dist/cjs-types/react/ConvexAuthState.test.d.ts.map +0 -1
  217. package/dist/cjs-types/react/auth_helpers.test.d.ts +0 -2
  218. package/dist/cjs-types/react/auth_helpers.test.d.ts.map +0 -1
  219. package/dist/cjs-types/react/auth_websocket.test.d.ts +0 -2
  220. package/dist/cjs-types/react/auth_websocket.test.d.ts.map +0 -1
  221. package/dist/cjs-types/react/client.test.d.ts +0 -2
  222. package/dist/cjs-types/react/client.test.d.ts.map +0 -1
  223. package/dist/cjs-types/react/client_provided_base_client.test.d.ts +0 -2
  224. package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +0 -1
  225. package/dist/cjs-types/react/queries_observer.test.d.ts +0 -2
  226. package/dist/cjs-types/react/queries_observer.test.d.ts.map +0 -1
  227. package/dist/cjs-types/react/react_node.test.d.ts +0 -2
  228. package/dist/cjs-types/react/react_node.test.d.ts.map +0 -1
  229. package/dist/cjs-types/react/use_paginated_query.test.d.ts +0 -2
  230. package/dist/cjs-types/react/use_paginated_query.test.d.ts.map +0 -1
  231. package/dist/cjs-types/react/use_queries.test.d.ts +0 -5
  232. package/dist/cjs-types/react/use_queries.test.d.ts.map +0 -1
  233. package/dist/cjs-types/react/use_query.test.d.ts +0 -5
  234. package/dist/cjs-types/react/use_query.test.d.ts.map +0 -1
  235. package/dist/cjs-types/react/use_query_object_options.test.d.ts +0 -5
  236. package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +0 -1
  237. package/dist/cjs-types/react/use_query_result.test.d.ts +0 -5
  238. package/dist/cjs-types/react/use_query_result.test.d.ts.map +0 -1
  239. package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
  240. package/dist/cjs-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
  241. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
  242. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
  243. package/dist/cjs-types/server/api.intersect.test.d.ts +0 -2
  244. package/dist/cjs-types/server/api.intersect.test.d.ts.map +0 -1
  245. package/dist/cjs-types/server/api.test.d.ts +0 -2
  246. package/dist/cjs-types/server/api.test.d.ts.map +0 -1
  247. package/dist/cjs-types/server/audit_logging.test.d.ts +0 -2
  248. package/dist/cjs-types/server/audit_logging.test.d.ts.map +0 -1
  249. package/dist/cjs-types/server/components/index.test.d.ts +0 -2
  250. package/dist/cjs-types/server/components/index.test.d.ts.map +0 -1
  251. package/dist/cjs-types/server/cron.test.d.ts +0 -2
  252. package/dist/cjs-types/server/cron.test.d.ts.map +0 -1
  253. package/dist/cjs-types/server/data_model.test.d.ts +0 -2
  254. package/dist/cjs-types/server/data_model.test.d.ts.map +0 -1
  255. package/dist/cjs-types/server/database.test.d.ts +0 -2
  256. package/dist/cjs-types/server/database.test.d.ts.map +0 -1
  257. package/dist/cjs-types/server/database_api.test.d.ts +0 -2
  258. package/dist/cjs-types/server/database_api.test.d.ts.map +0 -1
  259. package/dist/cjs-types/server/filter_builder.test.d.ts +0 -2
  260. package/dist/cjs-types/server/filter_builder.test.d.ts.map +0 -1
  261. package/dist/cjs-types/server/impl/actions_impl.test.d.ts +0 -2
  262. package/dist/cjs-types/server/impl/actions_impl.test.d.ts.map +0 -1
  263. package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts +0 -2
  264. package/dist/cjs-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
  265. package/dist/cjs-types/server/impl/query_impl.test.d.ts +0 -2
  266. package/dist/cjs-types/server/impl/query_impl.test.d.ts.map +0 -1
  267. package/dist/cjs-types/server/pagination.test.d.ts +0 -2
  268. package/dist/cjs-types/server/pagination.test.d.ts.map +0 -1
  269. package/dist/cjs-types/server/query.test.d.ts +0 -2
  270. package/dist/cjs-types/server/query.test.d.ts.map +0 -1
  271. package/dist/cjs-types/server/registration.test.d.ts +0 -2
  272. package/dist/cjs-types/server/registration.test.d.ts.map +0 -1
  273. package/dist/cjs-types/server/router.test.d.ts +0 -2
  274. package/dist/cjs-types/server/router.test.d.ts.map +0 -1
  275. package/dist/cjs-types/server/scheduler.test.d.ts +0 -2
  276. package/dist/cjs-types/server/scheduler.test.d.ts.map +0 -1
  277. package/dist/cjs-types/server/schema.test.d.ts +0 -2
  278. package/dist/cjs-types/server/schema.test.d.ts.map +0 -1
  279. package/dist/cjs-types/test/fake_watch.d.ts +0 -16
  280. package/dist/cjs-types/test/fake_watch.d.ts.map +0 -1
  281. package/dist/cjs-types/test/type_testing.d.ts +0 -9
  282. package/dist/cjs-types/test/type_testing.d.ts.map +0 -1
  283. package/dist/cjs-types/type_utils.test.d.ts +0 -2
  284. package/dist/cjs-types/type_utils.test.d.ts.map +0 -1
  285. package/dist/cjs-types/values/size.test.d.ts +0 -2
  286. package/dist/cjs-types/values/size.test.d.ts.map +0 -1
  287. package/dist/cjs-types/values/validator.test.d.ts +0 -2
  288. package/dist/cjs-types/values/validator.test.d.ts.map +0 -1
  289. package/dist/cjs-types/values/value.test.d.ts +0 -2
  290. package/dist/cjs-types/values/value.test.d.ts.map +0 -1
  291. package/dist/esm-types/browser/http_client.test.d.ts +0 -2
  292. package/dist/esm-types/browser/http_client.test.d.ts.map +0 -1
  293. package/dist/esm-types/browser/query_options.test.d.ts +0 -2
  294. package/dist/esm-types/browser/query_options.test.d.ts.map +0 -1
  295. package/dist/esm-types/browser/simple_client.test.d.ts +0 -2
  296. package/dist/esm-types/browser/simple_client.test.d.ts.map +0 -1
  297. package/dist/esm-types/browser/sync/client.test.d.ts +0 -5
  298. package/dist/esm-types/browser/sync/client.test.d.ts.map +0 -1
  299. package/dist/esm-types/browser/sync/client_node.test.d.ts +0 -2
  300. package/dist/esm-types/browser/sync/client_node.test.d.ts.map +0 -1
  301. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts +0 -44
  302. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts.map +0 -1
  303. package/dist/esm-types/browser/sync/local_state.test.d.ts +0 -2
  304. package/dist/esm-types/browser/sync/local_state.test.d.ts.map +0 -1
  305. package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts +0 -2
  306. package/dist/esm-types/browser/sync/optimistic_query_set.test.d.ts.map +0 -1
  307. package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts +0 -2
  308. package/dist/esm-types/browser/sync/paginated_query_client.test.d.ts.map +0 -1
  309. package/dist/esm-types/browser/sync/protocol.test.d.ts +0 -5
  310. package/dist/esm-types/browser/sync/protocol.test.d.ts.map +0 -1
  311. package/dist/esm-types/browser/sync/request_manager.test.d.ts +0 -2
  312. package/dist/esm-types/browser/sync/request_manager.test.d.ts.map +0 -1
  313. package/dist/esm-types/bundler/fs.test.d.ts +0 -2
  314. package/dist/esm-types/bundler/fs.test.d.ts.map +0 -1
  315. package/dist/esm-types/bundler/index.test.d.ts +0 -2
  316. package/dist/esm-types/bundler/index.test.d.ts.map +0 -1
  317. package/dist/esm-types/cli/codegen_templates/api.test.d.ts +0 -2
  318. package/dist/esm-types/cli/codegen_templates/api.test.d.ts.map +0 -1
  319. package/dist/esm-types/cli/codegen_templates/common.test.d.ts +0 -2
  320. package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +0 -1
  321. package/dist/esm-types/cli/codegen_templates/templates.test.d.ts +0 -2
  322. package/dist/esm-types/cli/codegen_templates/templates.test.d.ts.map +0 -1
  323. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +0 -2
  324. package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +0 -1
  325. package/dist/esm-types/cli/configure.test.d.ts +0 -2
  326. package/dist/esm-types/cli/configure.test.d.ts.map +0 -1
  327. package/dist/esm-types/cli/deploymentCreate.test.d.ts +0 -2
  328. package/dist/esm-types/cli/deploymentCreate.test.d.ts.map +0 -1
  329. package/dist/esm-types/cli/deploymentSelect.test.d.ts +0 -2
  330. package/dist/esm-types/cli/deploymentSelect.test.d.ts.map +0 -1
  331. package/dist/esm-types/cli/deploymentSelection.test.d.ts +0 -2
  332. package/dist/esm-types/cli/deploymentSelection.test.d.ts.map +0 -1
  333. package/dist/esm-types/cli/deploymentToken.test.d.ts +0 -2
  334. package/dist/esm-types/cli/deploymentToken.test.d.ts.map +0 -1
  335. package/dist/esm-types/cli/dev.test.d.ts +0 -2
  336. package/dist/esm-types/cli/dev.test.d.ts.map +0 -1
  337. package/dist/esm-types/cli/envDefault.test.d.ts +0 -2
  338. package/dist/esm-types/cli/envDefault.test.d.ts.map +0 -1
  339. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +0 -2
  340. package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +0 -1
  341. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +0 -2
  342. package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +0 -1
  343. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +0 -2
  344. package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +0 -1
  345. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts +0 -2
  346. package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +0 -1
  347. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts +0 -2
  348. package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +0 -1
  349. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts +0 -2
  350. package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +0 -1
  351. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +0 -2
  352. package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +0 -1
  353. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +0 -2
  354. package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +0 -1
  355. package/dist/esm-types/cli/lib/codegen.test.d.ts +0 -2
  356. package/dist/esm-types/cli/lib/codegen.test.d.ts.map +0 -1
  357. package/dist/esm-types/cli/lib/components.test.d.ts +0 -2
  358. package/dist/esm-types/cli/lib/components.test.d.ts.map +0 -1
  359. package/dist/esm-types/cli/lib/config.test.d.ts +0 -2
  360. package/dist/esm-types/cli/lib/config.test.d.ts.map +0 -1
  361. package/dist/esm-types/cli/lib/deployment.test.d.ts +0 -2
  362. package/dist/esm-types/cli/lib/deployment.test.d.ts.map +0 -1
  363. package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts +0 -2
  364. package/dist/esm-types/cli/lib/deploymentSelector.test.d.ts.map +0 -1
  365. package/dist/esm-types/cli/lib/env.test.d.ts +0 -2
  366. package/dist/esm-types/cli/lib/env.test.d.ts.map +0 -1
  367. package/dist/esm-types/cli/lib/expiration.test.d.ts +0 -2
  368. package/dist/esm-types/cli/lib/expiration.test.d.ts.map +0 -1
  369. package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts +0 -2
  370. package/dist/esm-types/cli/lib/extractDeploymentNameForWorkOS.test.d.ts.map +0 -1
  371. package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts +0 -2
  372. package/dist/esm-types/cli/lib/formatEnvValueForDotfile.test.d.ts.map +0 -1
  373. package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts +0 -2
  374. package/dist/esm-types/cli/lib/formatTargetedDeployment.test.d.ts.map +0 -1
  375. package/dist/esm-types/cli/lib/fsUtils.test.d.ts +0 -2
  376. package/dist/esm-types/cli/lib/fsUtils.test.d.ts.map +0 -1
  377. package/dist/esm-types/cli/lib/generateDocs.test.d.ts +0 -2
  378. package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +0 -1
  379. package/dist/esm-types/cli/lib/indexes.test.d.ts +0 -2
  380. package/dist/esm-types/cli/lib/indexes.test.d.ts.map +0 -1
  381. package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts +0 -2
  382. package/dist/esm-types/cli/lib/localDeployment/run.test.d.ts.map +0 -1
  383. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +0 -2
  384. package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +0 -1
  385. package/dist/esm-types/cli/lib/run.test.d.ts +0 -2
  386. package/dist/esm-types/cli/lib/run.test.d.ts.map +0 -1
  387. package/dist/esm-types/cli/lib/runTestFunction.test.d.ts +0 -2
  388. package/dist/esm-types/cli/lib/runTestFunction.test.d.ts.map +0 -1
  389. package/dist/esm-types/cli/lib/typecheck.test.d.ts +0 -2
  390. package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +0 -1
  391. package/dist/esm-types/cli/lib/updates.test.d.ts +0 -2
  392. package/dist/esm-types/cli/lib/updates.test.d.ts.map +0 -1
  393. package/dist/esm-types/cli/lib/utils/hash.test.d.ts +0 -2
  394. package/dist/esm-types/cli/lib/utils/hash.test.d.ts.map +0 -1
  395. package/dist/esm-types/cli/lib/utils/utils.test.d.ts +0 -2
  396. package/dist/esm-types/cli/lib/utils/utils.test.d.ts.map +0 -1
  397. package/dist/esm-types/cli/lib/versionApi.test.d.ts +0 -2
  398. package/dist/esm-types/cli/lib/versionApi.test.d.ts.map +0 -1
  399. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts +0 -2
  400. package/dist/esm-types/cli/lib/workos/environmentApi.test.d.ts.map +0 -1
  401. package/dist/esm-types/cli/lib/workos/workos.test.d.ts +0 -2
  402. package/dist/esm-types/cli/lib/workos/workos.test.d.ts.map +0 -1
  403. package/dist/esm-types/cli/login.test.d.ts +0 -2
  404. package/dist/esm-types/cli/login.test.d.ts.map +0 -1
  405. package/dist/esm-types/common/index.test.d.ts +0 -2
  406. package/dist/esm-types/common/index.test.d.ts.map +0 -1
  407. package/dist/esm-types/nextjs/nextjs.test.d.ts +0 -2
  408. package/dist/esm-types/nextjs/nextjs.test.d.ts.map +0 -1
  409. package/dist/esm-types/react/ConvexAuthState.test.d.ts +0 -2
  410. package/dist/esm-types/react/ConvexAuthState.test.d.ts.map +0 -1
  411. package/dist/esm-types/react/auth_helpers.test.d.ts +0 -2
  412. package/dist/esm-types/react/auth_helpers.test.d.ts.map +0 -1
  413. package/dist/esm-types/react/auth_websocket.test.d.ts +0 -2
  414. package/dist/esm-types/react/auth_websocket.test.d.ts.map +0 -1
  415. package/dist/esm-types/react/client.test.d.ts +0 -2
  416. package/dist/esm-types/react/client.test.d.ts.map +0 -1
  417. package/dist/esm-types/react/client_provided_base_client.test.d.ts +0 -2
  418. package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +0 -1
  419. package/dist/esm-types/react/queries_observer.test.d.ts +0 -2
  420. package/dist/esm-types/react/queries_observer.test.d.ts.map +0 -1
  421. package/dist/esm-types/react/react_node.test.d.ts +0 -2
  422. package/dist/esm-types/react/react_node.test.d.ts.map +0 -1
  423. package/dist/esm-types/react/use_paginated_query.test.d.ts +0 -2
  424. package/dist/esm-types/react/use_paginated_query.test.d.ts.map +0 -1
  425. package/dist/esm-types/react/use_queries.test.d.ts +0 -5
  426. package/dist/esm-types/react/use_queries.test.d.ts.map +0 -1
  427. package/dist/esm-types/react/use_query.test.d.ts +0 -5
  428. package/dist/esm-types/react/use_query.test.d.ts.map +0 -1
  429. package/dist/esm-types/react/use_query_object_options.test.d.ts +0 -5
  430. package/dist/esm-types/react/use_query_object_options.test.d.ts.map +0 -1
  431. package/dist/esm-types/react/use_query_result.test.d.ts +0 -5
  432. package/dist/esm-types/react/use_query_result.test.d.ts.map +0 -1
  433. package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts +0 -2
  434. package/dist/esm-types/react-auth0/ConvexProviderWithAuth0.test.d.ts.map +0 -1
  435. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts +0 -2
  436. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.test.d.ts.map +0 -1
  437. package/dist/esm-types/server/api.intersect.test.d.ts +0 -2
  438. package/dist/esm-types/server/api.intersect.test.d.ts.map +0 -1
  439. package/dist/esm-types/server/api.test.d.ts +0 -2
  440. package/dist/esm-types/server/api.test.d.ts.map +0 -1
  441. package/dist/esm-types/server/audit_logging.test.d.ts +0 -2
  442. package/dist/esm-types/server/audit_logging.test.d.ts.map +0 -1
  443. package/dist/esm-types/server/components/index.test.d.ts +0 -2
  444. package/dist/esm-types/server/components/index.test.d.ts.map +0 -1
  445. package/dist/esm-types/server/cron.test.d.ts +0 -2
  446. package/dist/esm-types/server/cron.test.d.ts.map +0 -1
  447. package/dist/esm-types/server/data_model.test.d.ts +0 -2
  448. package/dist/esm-types/server/data_model.test.d.ts.map +0 -1
  449. package/dist/esm-types/server/database.test.d.ts +0 -2
  450. package/dist/esm-types/server/database.test.d.ts.map +0 -1
  451. package/dist/esm-types/server/database_api.test.d.ts +0 -2
  452. package/dist/esm-types/server/database_api.test.d.ts.map +0 -1
  453. package/dist/esm-types/server/filter_builder.test.d.ts +0 -2
  454. package/dist/esm-types/server/filter_builder.test.d.ts.map +0 -1
  455. package/dist/esm-types/server/impl/actions_impl.test.d.ts +0 -2
  456. package/dist/esm-types/server/impl/actions_impl.test.d.ts.map +0 -1
  457. package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts +0 -2
  458. package/dist/esm-types/server/impl/filter_builder_impl.test.d.ts.map +0 -1
  459. package/dist/esm-types/server/impl/query_impl.test.d.ts +0 -2
  460. package/dist/esm-types/server/impl/query_impl.test.d.ts.map +0 -1
  461. package/dist/esm-types/server/pagination.test.d.ts +0 -2
  462. package/dist/esm-types/server/pagination.test.d.ts.map +0 -1
  463. package/dist/esm-types/server/query.test.d.ts +0 -2
  464. package/dist/esm-types/server/query.test.d.ts.map +0 -1
  465. package/dist/esm-types/server/registration.test.d.ts +0 -2
  466. package/dist/esm-types/server/registration.test.d.ts.map +0 -1
  467. package/dist/esm-types/server/router.test.d.ts +0 -2
  468. package/dist/esm-types/server/router.test.d.ts.map +0 -1
  469. package/dist/esm-types/server/scheduler.test.d.ts +0 -2
  470. package/dist/esm-types/server/scheduler.test.d.ts.map +0 -1
  471. package/dist/esm-types/server/schema.test.d.ts +0 -2
  472. package/dist/esm-types/server/schema.test.d.ts.map +0 -1
  473. package/dist/esm-types/test/fake_watch.d.ts +0 -16
  474. package/dist/esm-types/test/fake_watch.d.ts.map +0 -1
  475. package/dist/esm-types/test/type_testing.d.ts +0 -9
  476. package/dist/esm-types/test/type_testing.d.ts.map +0 -1
  477. package/dist/esm-types/type_utils.test.d.ts +0 -2
  478. package/dist/esm-types/type_utils.test.d.ts.map +0 -1
  479. package/dist/esm-types/values/size.test.d.ts +0 -2
  480. package/dist/esm-types/values/size.test.d.ts.map +0 -1
  481. package/dist/esm-types/values/validator.test.d.ts +0 -2
  482. package/dist/esm-types/values/validator.test.d.ts.map +0 -1
  483. package/dist/esm-types/values/value.test.d.ts +0 -2
  484. package/dist/esm-types/values/value.test.d.ts.map +0 -1
  485. package/src/browser/http_client.test.ts +0 -202
  486. package/src/browser/query_options.test.ts +0 -43
  487. package/src/browser/simple_client.test.ts +0 -104
  488. package/src/browser/sync/client.test.ts +0 -44
  489. package/src/browser/sync/client_node.test.ts +0 -1207
  490. package/src/browser/sync/client_node_test_helpers.ts +0 -200
  491. package/src/browser/sync/local_state.test.ts +0 -128
  492. package/src/browser/sync/optimistic_query_set.test.ts +0 -253
  493. package/src/browser/sync/paginated_query_client.test.ts +0 -597
  494. package/src/browser/sync/protocol.test.ts +0 -14
  495. package/src/browser/sync/request_manager.test.ts +0 -273
  496. package/src/bundler/fs.test.ts +0 -86
  497. package/src/bundler/index.test.ts +0 -210
  498. package/src/bundler/test_fixtures/js/project01/bar.js +0 -4
  499. package/src/bundler/test_fixtures/js/project01/file with spaces.js +0 -1
  500. package/src/bundler/test_fixtures/js/project01/foo.js +0 -9
  501. package/src/bundler/test_fixtures/js/project_with_https/https.js +0 -9
  502. package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/default.js +0 -3
  503. package/src/bundler/test_fixtures/js/project_with_https_not_at_top_level/more_code/https.js +0 -5
  504. package/src/bundler/test_fixtures/js/project_with_https_without_router/https.js +0 -1
  505. package/src/bundler/test_fixtures/js/project_with_node_shims/uses_node_shims.js +0 -4
  506. package/src/cli/codegen_templates/api.test.ts +0 -18
  507. package/src/cli/codegen_templates/common.test.ts +0 -52
  508. package/src/cli/codegen_templates/templates.test.ts +0 -16
  509. package/src/cli/codegen_templates/validator_helpers.test.ts +0 -31
  510. package/src/cli/configure.test.ts +0 -138
  511. package/src/cli/deploymentCreate.test.ts +0 -1376
  512. package/src/cli/deploymentSelect.test.ts +0 -1291
  513. package/src/cli/deploymentSelection.test.ts +0 -2546
  514. package/src/cli/deploymentToken.test.ts +0 -397
  515. package/src/cli/dev.test.ts +0 -157
  516. package/src/cli/envDefault.test.ts +0 -495
  517. package/src/cli/lib/__snapshots__/formatTargetedDeployment.test.ts.snap +0 -94
  518. package/src/cli/lib/aiFiles/agentsmd.test.ts +0 -133
  519. package/src/cli/lib/aiFiles/claudemd.test.ts +0 -92
  520. package/src/cli/lib/aiFiles/guidelinesmd.test.ts +0 -50
  521. package/src/cli/lib/aiFiles/index.test.ts +0 -986
  522. package/src/cli/lib/aiFiles/integration.test.ts +0 -692
  523. package/src/cli/lib/aiFiles/prompt.test.ts +0 -202
  524. package/src/cli/lib/aiFiles/state.test.ts +0 -305
  525. package/src/cli/lib/aiFiles/utils.test.ts +0 -50
  526. package/src/cli/lib/codegen.test.ts +0 -49
  527. package/src/cli/lib/components.test.ts +0 -227
  528. package/src/cli/lib/config.test.ts +0 -1026
  529. package/src/cli/lib/deployment.test.ts +0 -85
  530. package/src/cli/lib/deploymentSelector.test.ts +0 -107
  531. package/src/cli/lib/env.test.ts +0 -60
  532. package/src/cli/lib/expiration.test.ts +0 -159
  533. package/src/cli/lib/extractDeploymentNameForWorkOS.test.ts +0 -30
  534. package/src/cli/lib/formatEnvValueForDotfile.test.ts +0 -294
  535. package/src/cli/lib/formatTargetedDeployment.test.ts +0 -281
  536. package/src/cli/lib/fsUtils.test.ts +0 -67
  537. package/src/cli/lib/generateDocs.test.ts +0 -326
  538. package/src/cli/lib/indexes.test.ts +0 -77
  539. package/src/cli/lib/localDeployment/run.test.ts +0 -104
  540. package/src/cli/lib/localDeployment/secrets.test.ts +0 -53
  541. package/src/cli/lib/run.test.ts +0 -54
  542. package/src/cli/lib/runTestFunction.test.ts +0 -84
  543. package/src/cli/lib/typecheck.test.ts +0 -71
  544. package/src/cli/lib/updates.test.ts +0 -157
  545. package/src/cli/lib/utils/hash.test.ts +0 -25
  546. package/src/cli/lib/utils/utils.test.ts +0 -340
  547. package/src/cli/lib/versionApi.test.ts +0 -471
  548. package/src/cli/lib/workos/environmentApi.test.ts +0 -107
  549. package/src/cli/lib/workos/workos.test.ts +0 -242
  550. package/src/cli/login.test.ts +0 -261
  551. package/src/common/README.md +0 -2
  552. package/src/common/index.test.ts +0 -35
  553. package/src/nextjs/nextjs.test.tsx +0 -94
  554. package/src/react/ConvexAuthState.test.tsx +0 -702
  555. package/src/react/auth_helpers.test.tsx +0 -45
  556. package/src/react/auth_websocket.test.tsx +0 -1177
  557. package/src/react/client.test.tsx +0 -261
  558. package/src/react/client_provided_base_client.test.tsx +0 -174
  559. package/src/react/queries_observer.test.ts +0 -176
  560. package/src/react/react_node.test.ts +0 -78
  561. package/src/react/use_paginated_query.test.tsx +0 -1420
  562. package/src/react/use_queries.test.ts +0 -140
  563. package/src/react/use_query.test.ts +0 -71
  564. package/src/react/use_query_object_options.test.ts +0 -51
  565. package/src/react/use_query_result.test.ts +0 -75
  566. package/src/react-auth0/ConvexProviderWithAuth0.test.tsx +0 -17
  567. package/src/react-clerk/ConvexProviderWithClerk.test.tsx +0 -18
  568. package/src/server/README.md +0 -15
  569. package/src/server/api.intersect.test.ts +0 -109
  570. package/src/server/api.test.ts +0 -447
  571. package/src/server/audit_logging.test.ts +0 -131
  572. package/src/server/components/index.test.ts +0 -48
  573. package/src/server/cron.test.ts +0 -58
  574. package/src/server/data_model.test.ts +0 -221
  575. package/src/server/database.test.ts +0 -184
  576. package/src/server/database_api.test.ts +0 -439
  577. package/src/server/filter_builder.test.ts +0 -102
  578. package/src/server/impl/actions_impl.test.ts +0 -59
  579. package/src/server/impl/filter_builder_impl.test.ts +0 -13
  580. package/src/server/impl/query_impl.test.ts +0 -46
  581. package/src/server/pagination.test.ts +0 -49
  582. package/src/server/query.test.ts +0 -112
  583. package/src/server/registration.test.ts +0 -589
  584. package/src/server/router.test.ts +0 -148
  585. package/src/server/scheduler.test.ts +0 -31
  586. package/src/server/schema.test.ts +0 -1081
  587. package/src/test/fake_watch.ts +0 -54
  588. package/src/test/type_testing.ts +0 -21
  589. package/src/type_utils.test.ts +0 -62
  590. package/src/values/size.test.ts +0 -95
  591. package/src/values/validator.test.ts +0 -619
  592. package/src/values/value.test.ts +0 -232
  593. package/src/vendor/README.md +0 -18
  594. package/src/vendor/jwt-decode/README.md +0 -1
@@ -1,1420 +0,0 @@
1
- /**
2
- * @vitest-environment custom-vitest-environment.ts
3
- */
4
- import { expect, vi, test, describe, beforeEach } from "vitest";
5
- import { act, renderHook } from "@testing-library/react";
6
- import React from "react";
7
-
8
- import {
9
- anyApi,
10
- FunctionArgs,
11
- FunctionReference,
12
- FunctionReturnType,
13
- getFunctionName,
14
- makeFunctionReference,
15
- PaginationOptions,
16
- PaginationResult,
17
- } from "../server/index.js";
18
- import { assert, Equals } from "../test/type_testing.js";
19
- import { compareValues, convexToJson, Value } from "../values/index.js";
20
- import { ConvexProvider, ConvexReactClient } from "./client.js";
21
- import type {
22
- PaginatedQueryArgs,
23
- PaginatedQueryItem,
24
- PaginatedQueryReference,
25
- UsePaginatedQueryReturnType,
26
- } from "./use_paginated_query.js";
27
- import type { UsePaginatedQueryObjectReturnType } from "./use_paginated_query2.js";
28
- import {
29
- resetPaginationId,
30
- usePaginatedQuery,
31
- insertAtTop,
32
- insertAtPosition,
33
- } from "./use_paginated_query.js";
34
- import {
35
- resetPaginationId as resetPaginatedId2,
36
- usePaginatedQuery_experimental,
37
- } from "./use_paginated_query2.js";
38
- import { OptimisticLocalStore } from "../browser/index.js";
39
-
40
- // address is expected not to exist
41
- const address = "https://127.0.0.1:30001";
42
-
43
- type Props = { onError: (e: Error) => void; children: any };
44
- class ErrorBoundary extends React.Component<Props> {
45
- state: { error: Error | undefined } = { error: undefined };
46
- onError: (e: Error) => void;
47
-
48
- constructor(props: Props) {
49
- super(props);
50
- this.onError = props.onError;
51
- }
52
-
53
- componentDidCatch(error: Error) {
54
- this.onError(error);
55
- return { error };
56
- }
57
-
58
- render() {
59
- if (this.state.error) {
60
- return this.state.error.toString();
61
- }
62
-
63
- return this.props.children;
64
- }
65
- }
66
-
67
- describe.each([
68
- {
69
- usePaginatedQuery: usePaginatedQuery,
70
- resetPaginationId,
71
- version: "hook-based logic" as const,
72
- },
73
- {
74
- usePaginatedQuery: usePaginatedQuery_experimental,
75
- resetPaginationId: resetPaginatedId2,
76
- version: "client-based logic" as const,
77
- },
78
- ] as {
79
- usePaginatedQuery:
80
- | typeof usePaginatedQuery
81
- | typeof usePaginatedQuery_experimental;
82
- resetPaginationId: typeof resetPaginationId;
83
- version: "hook-based logic" | "client-based logic";
84
- }[])(
85
- "usePaginatedQuery $version",
86
- ({ usePaginatedQuery, version, resetPaginationId }) => {
87
- test.each([
88
- {
89
- options: undefined,
90
- expectedError:
91
- "Error: `options.initialNumItems` must be a positive number. Received `undefined`.",
92
- },
93
- {
94
- options: {},
95
- expectedError:
96
- "Error: `options.initialNumItems` must be a positive number. Received `undefined`.",
97
- },
98
- {
99
- options: { initialNumItems: -1 },
100
- expectedError:
101
- "Error: `options.initialNumItems` must be a positive number. Received `-1`.",
102
- },
103
- {
104
- options: { initialNumItems: "wrongType" },
105
- expectedError:
106
- "Error: `options.initialNumItems` must be a positive number. Received `wrongType`.",
107
- },
108
- ])(
109
- "Throws an error when options is $options",
110
- ({ options, expectedError }) => {
111
- const convexClient = new ConvexReactClient(address);
112
- let lastError: Error | undefined = undefined;
113
- function updateError(e: Error) {
114
- lastError = e;
115
- }
116
-
117
- const wrapper = ({ children }: { children: React.ReactNode }) => (
118
- <ErrorBoundary onError={updateError}>
119
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
120
- </ErrorBoundary>
121
- );
122
-
123
- renderHook(
124
- () =>
125
- usePaginatedQuery(
126
- makeFunctionReference<"query">("myQuery"),
127
- {},
128
- // @ts-expect-error We're testing user programming errors
129
- options,
130
- ),
131
- {
132
- wrapper,
133
- },
134
- );
135
- expect(lastError).not.toBeUndefined();
136
- expect(lastError!.toString()).toEqual(expectedError);
137
- },
138
- );
139
-
140
- function pushFirstPageError(client: ConvexReactClient, message: string) {
141
- act(() => {
142
- void client.mutation(
143
- anyApi.myMutation.default,
144
- {},
145
- {
146
- optimisticUpdate: (localStore) => {
147
- localStore.setQuery(
148
- anyApi.myQuery.default,
149
- {
150
- paginationOpts: {
151
- numItems: 10,
152
- cursor: null,
153
- id: 1,
154
- },
155
- },
156
- new Error(
157
- message,
158
- ) as unknown as FunctionReturnType<PaginatedQueryReference>,
159
- );
160
- },
161
- },
162
- );
163
- });
164
- }
165
-
166
- test("Positional form continues throwing on errors", () => {
167
- if (version === "client-based logic") {
168
- return;
169
- }
170
- const convexClient = new ConvexReactClient(address);
171
- resetPaginationId();
172
- let lastError: Error | undefined;
173
- const wrapper = ({ children }: { children: React.ReactNode }) => (
174
- <ErrorBoundary onError={(e) => (lastError = e)}>
175
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
176
- </ErrorBoundary>
177
- );
178
-
179
- renderHook(
180
- () =>
181
- usePaginatedQuery(
182
- makeFunctionReference<"query">("myQuery"),
183
- {},
184
- {
185
- initialNumItems: 10,
186
- },
187
- ),
188
- { wrapper },
189
- );
190
-
191
- pushFirstPageError(convexClient, "boom-positional");
192
-
193
- expect(lastError).toBeDefined();
194
- expect(lastError?.message).toBe("boom-positional");
195
- });
196
-
197
- test("Returns nothing when args are 'skip'", () => {
198
- const convexClient = new ConvexReactClient(address);
199
- const watchQuerySpy =
200
- version === "hook-based logic"
201
- ? vi.spyOn(convexClient, "watchQuery")
202
- : vi.spyOn(convexClient, "watchPaginatedQuery");
203
- const wrapper = ({ children }: { children: React.ReactNode }) => (
204
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
205
- );
206
-
207
- const { result } = renderHook(
208
- () =>
209
- usePaginatedQuery(makeFunctionReference<"query">("myQuery"), "skip", {
210
- initialNumItems: 10,
211
- }),
212
- { wrapper },
213
- );
214
-
215
- expect(watchQuerySpy.mock.calls).toEqual([]);
216
- expect(result.current).toMatchObject({
217
- isLoading: true,
218
- results: [],
219
- status: "LoadingFirstPage",
220
- });
221
- });
222
-
223
- test("Initially returns LoadingFirstPage", () => {
224
- const convexClient = new ConvexReactClient(address);
225
- const watchQuerySpy = vi.spyOn(convexClient, "watchQuery");
226
- const wrapper = ({ children }: { children: React.ReactNode }) => (
227
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
228
- );
229
-
230
- const { result } = renderHook(
231
- () =>
232
- usePaginatedQuery(
233
- makeFunctionReference<"query">("myQuery"),
234
- {},
235
- { initialNumItems: 10 },
236
- ),
237
- { wrapper },
238
- );
239
-
240
- if (version === "hook-based logic") {
241
- expect(watchQuerySpy.mock.calls[1]).toEqual([
242
- makeFunctionReference("myQuery"),
243
- {
244
- paginationOpts: {
245
- cursor: null,
246
- id: expect.anything(),
247
- numItems: 10,
248
- },
249
- },
250
- { journal: undefined },
251
- ]);
252
- }
253
- expect(result.current).toMatchObject({
254
- isLoading: true,
255
- results: [],
256
- status: "LoadingFirstPage",
257
- });
258
- });
259
-
260
- test("Updates to a new query if query name or args change", () => {
261
- const convexClient = new ConvexReactClient(address);
262
- const watchQuerySpy = vi.spyOn(convexClient, "watchQuery");
263
-
264
- let args: [
265
- query: FunctionReference<"query">,
266
- args: Record<string, Value>,
267
- options: { initialNumItems: number },
268
- ] = [makeFunctionReference("myQuery"), {}, { initialNumItems: 10 }];
269
- const wrapper = ({ children }: { children: React.ReactNode }) => (
270
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
271
- );
272
-
273
- const { rerender } = renderHook(() => usePaginatedQuery(...args), {
274
- wrapper,
275
- });
276
-
277
- if (version === "hook-based logic") {
278
- // Starts with just the initial query.
279
- expect(watchQuerySpy.mock.calls.length).toBe(3);
280
- expect(watchQuerySpy.mock.calls[1]).toEqual([
281
- makeFunctionReference("myQuery"),
282
- {
283
- paginationOpts: {
284
- cursor: null,
285
- id: expect.anything(),
286
- numItems: 10,
287
- },
288
- },
289
- { journal: undefined },
290
- ]);
291
- }
292
-
293
- // If we change the query name, we get a new call.
294
- args = [
295
- makeFunctionReference<"query">("myQuery2"),
296
- {},
297
- { initialNumItems: 10 },
298
- ];
299
- rerender();
300
- if (version === "hook-based logic") {
301
- expect(watchQuerySpy.mock.calls.length).toBe(6);
302
- expect(watchQuerySpy.mock.calls[4]).toEqual([
303
- makeFunctionReference("myQuery2"),
304
- {
305
- paginationOpts: {
306
- cursor: null,
307
- id: expect.anything(),
308
- numItems: 10,
309
- },
310
- },
311
- { journal: undefined },
312
- ]);
313
- }
314
-
315
- // If we add an arg, it also updates.
316
- args = [
317
- makeFunctionReference("myQuery2"),
318
- { someArg: 123 },
319
- { initialNumItems: 10 },
320
- ];
321
- rerender();
322
- if (version === "hook-based logic") {
323
- expect(watchQuerySpy.mock.calls.length).toBe(9);
324
- expect(watchQuerySpy.mock.calls[7]).toEqual([
325
- makeFunctionReference("myQuery2"),
326
- {
327
- paginationOpts: {
328
- cursor: null,
329
- id: expect.anything(),
330
- numItems: 10,
331
- },
332
- someArg: 123,
333
- },
334
- { journal: undefined },
335
- ]);
336
- }
337
-
338
- // Updating to a new arg object that serializes the same thing doesn't increase
339
- // the all count.
340
- args = [
341
- makeFunctionReference("myQuery2"),
342
- { someArg: 123 },
343
- { initialNumItems: 10 },
344
- ];
345
- rerender();
346
- if (version === "hook-based logic") {
347
- expect(watchQuerySpy.mock.calls.length).toBe(9);
348
- }
349
- });
350
-
351
- describe("usePaginatedQuery pages", () => {
352
- let client: ConvexReactClient;
353
- const wrapper = ({ children }: { children: React.ReactNode }) => (
354
- <ConvexProvider client={client}>{children}</ConvexProvider>
355
- );
356
- const query: FunctionReference<"query"> =
357
- makeFunctionReference("myQuery");
358
- /**
359
- * How do you reach in and do these underlying queries?
360
- * And how in the old system did a paginated query know to use
361
- * these pages?
362
- *
363
- */
364
- const mockPage = (
365
- opts: PaginationOptions,
366
- retval: PaginationResult<unknown>,
367
- ) => {
368
- act(() => {
369
- // Set a query result with an optimistic update.
370
- // The mutation doesn't go through because the client's websocket isn't
371
- // connected, so the optimistic update persists.
372
- void client.mutation(
373
- anyApi.myMutation.default,
374
- // TODO TOMHERE let's handle optimistic updates the old way:
375
- // you need to update the underlying one.
376
- // How should you be able to associate this query
377
- // with your paginated query?
378
- {},
379
- {
380
- optimisticUpdate: (localStore) => {
381
- localStore.setQuery(
382
- anyApi.myQuery.default,
383
- {
384
- paginationOpts: { ...opts, id: 1 },
385
- },
386
- retval,
387
- );
388
- },
389
- },
390
- );
391
- });
392
- };
393
-
394
- beforeEach(() => {
395
- client = new ConvexReactClient(address);
396
- resetPaginationId();
397
- });
398
-
399
- test("loadMore", () => {
400
- const { result } = renderHook(
401
- () => usePaginatedQuery(query, {}, { initialNumItems: 1 }),
402
- { wrapper },
403
- );
404
- expect(result.current.status).toStrictEqual("LoadingFirstPage");
405
- // What's happening here is that we're anticipating the queries our code will make.
406
- mockPage(
407
- {
408
- numItems: 1,
409
- cursor: null,
410
- },
411
- {
412
- page: ["item1"],
413
- continueCursor: "abc",
414
- isDone: false,
415
- },
416
- );
417
- expect(result.current.status).toStrictEqual("CanLoadMore");
418
- expect(result.current.results).toStrictEqual(["item1"]);
419
- mockPage(
420
- {
421
- numItems: 2,
422
- cursor: "abc",
423
- },
424
- {
425
- page: ["item2"],
426
- continueCursor: "def",
427
- isDone: true,
428
- },
429
- );
430
- act(() => {
431
- result.current.loadMore(2);
432
- });
433
- expect(result.current.status).toStrictEqual("Exhausted");
434
- expect(result.current.results).toStrictEqual(["item1", "item2"]);
435
- });
436
-
437
- test("single page updating", () => {
438
- const { result } = renderHook(
439
- () => usePaginatedQuery(query, {}, { initialNumItems: 1 }),
440
- { wrapper },
441
- );
442
- mockPage(
443
- {
444
- numItems: 1,
445
- cursor: null,
446
- },
447
- {
448
- page: ["item1"],
449
- continueCursor: "abc",
450
- isDone: true,
451
- },
452
- );
453
- expect(result.current.status).toStrictEqual("Exhausted");
454
- expect(result.current.results).toStrictEqual(["item1"]);
455
- mockPage(
456
- {
457
- numItems: 1,
458
- cursor: null,
459
- },
460
- {
461
- page: ["item2", "item3"],
462
- continueCursor: "def",
463
- isDone: true,
464
- },
465
- );
466
- expect(result.current.status).toStrictEqual("Exhausted");
467
- expect(result.current.results).toStrictEqual(["item2", "item3"]);
468
- });
469
-
470
- test("page split", () => {
471
- const { result } = renderHook(
472
- () => usePaginatedQuery(query, {}, { initialNumItems: 1 }),
473
- { wrapper },
474
- );
475
- mockPage(
476
- {
477
- numItems: 1,
478
- cursor: null,
479
- },
480
- {
481
- page: ["item1", "item2", "item3", "item4"],
482
- continueCursor: "abc",
483
- splitCursor: "mid",
484
- isDone: true,
485
- },
486
- );
487
- expect(result.current.status).toStrictEqual("Exhausted");
488
- expect(result.current.results).toStrictEqual([
489
- "item1",
490
- "item2",
491
- "item3",
492
- "item4",
493
- ]);
494
- mockPage(
495
- {
496
- numItems: 1,
497
- cursor: null,
498
- endCursor: "mid",
499
- },
500
- {
501
- page: ["item1S", "item2S"],
502
- continueCursor: "mid",
503
- isDone: false,
504
- },
505
- );
506
- mockPage(
507
- {
508
- numItems: 1,
509
- cursor: "mid",
510
- endCursor: "abc",
511
- },
512
- {
513
- page: ["item3S", "item4S"],
514
- continueCursor: "abc",
515
- isDone: true,
516
- },
517
- );
518
- expect(result.current.status).toStrictEqual("Exhausted");
519
- expect(result.current.results).toStrictEqual([
520
- "item1S",
521
- "item2S",
522
- "item3S",
523
- "item4S",
524
- ]);
525
- });
526
- });
527
-
528
- describe("PaginatedQueryArgs", () => {
529
- test("basic", () => {
530
- type MyQueryFunction = FunctionReference<
531
- "query",
532
- "public",
533
- { paginationOpts: PaginationOptions; property: string },
534
- PaginationResult<string>
535
- >;
536
- type Args = PaginatedQueryArgs<MyQueryFunction>;
537
- type ExpectedArgs = { property: string };
538
- assert<Equals<Args, ExpectedArgs>>();
539
- });
540
- });
541
-
542
- describe("PaginatedQueryItem", () => {
543
- test("interface return type", () => {
544
- interface ReturnType {
545
- property: string;
546
- }
547
- type MyQueryFunction = FunctionReference<
548
- "query",
549
- "public",
550
- { paginationOpts: PaginationOptions; property: string },
551
- PaginationResult<ReturnType>
552
- >;
553
- type ActualReturnType = PaginatedQueryItem<MyQueryFunction>;
554
- assert<Equals<ActualReturnType, ReturnType>>();
555
- });
556
- });
557
-
558
- describe("UsePaginatedQueryObjectReturnType", () => {
559
- type MyQuery = FunctionReference<
560
- "query",
561
- "public",
562
- { paginationOpts: PaginationOptions },
563
- PaginationResult<string>
564
- >;
565
-
566
- test("object-form return type includes error variant", () => {
567
- type ObjResult = UsePaginatedQueryObjectReturnType<MyQuery>;
568
- type ErrorVariant = Extract<ObjResult, { status: "error" }>;
569
- assert<
570
- Equals<
571
- ErrorVariant,
572
- {
573
- data: string[];
574
- status: "error";
575
- canLoadMore: false;
576
- isLoading: false;
577
- error: Error;
578
- loadMore: (numItems: number) => void;
579
- }
580
- >
581
- >();
582
- });
583
-
584
- test("positional-form return type does NOT include error variant", () => {
585
- type PosResult = UsePaginatedQueryReturnType<MyQuery>;
586
- type ErrorVariant = Extract<PosResult, { status: "error" }>;
587
- assert<Equals<ErrorVariant, never>>();
588
- });
589
-
590
- test("object-form pending variant allows data during load-more", () => {
591
- type ObjResult = UsePaginatedQueryObjectReturnType<MyQuery>;
592
- type PendingVariants = Extract<ObjResult, { status: "pending" }>;
593
- type PendingData = PendingVariants["data"];
594
- assert<Equals<PendingData, string[] | undefined>>();
595
- });
596
-
597
- test("narrowing on status === 'error' gives access to error field", () => {
598
- type ObjResult = UsePaginatedQueryObjectReturnType<MyQuery>;
599
- type NarrowedError = Extract<ObjResult, { status: "error" }>["error"];
600
- assert<Equals<NarrowedError, Error>>();
601
- });
602
-
603
- test("success variant has canLoadMore as boolean", () => {
604
- type ObjResult = UsePaginatedQueryObjectReturnType<MyQuery>;
605
- type SuccessVariant = Extract<ObjResult, { status: "success" }>;
606
- assert<
607
- Equals<
608
- SuccessVariant,
609
- {
610
- data: string[];
611
- status: "success";
612
- canLoadMore: boolean;
613
- isLoading: false;
614
- error: undefined;
615
- loadMore: (numItems: number) => void;
616
- }
617
- >
618
- >();
619
- });
620
- });
621
-
622
- class LocalQueryStoreFake implements OptimisticLocalStore {
623
- queries: Record<
624
- string,
625
- Record<
626
- string,
627
- { args: Record<string, Value>; value: undefined | Value }
628
- >
629
- > = {};
630
- constructor() {
631
- this.queries = {};
632
- }
633
- setQuery(query: FunctionReference<"query">, args: any, value: any) {
634
- const queriesByName = this.queries[getFunctionName(query)] ?? {};
635
- this.queries[getFunctionName(query)] = queriesByName;
636
- const rawArgs = args ?? {};
637
-
638
- const serializedArgs = JSON.stringify(convexToJson(rawArgs));
639
- queriesByName[serializedArgs] = { args: rawArgs, value };
640
- }
641
-
642
- getAllQueries<Query extends FunctionReference<"query">>(
643
- query: Query,
644
- ): Array<{
645
- args: FunctionArgs<Query>;
646
- value: undefined | FunctionReturnType<Query>;
647
- }> {
648
- return Object.values(this.queries[getFunctionName(query)] ?? {}).map(
649
- (q) => ({
650
- args: q.args,
651
- value: q.value,
652
- }),
653
- );
654
- }
655
-
656
- getQuery(query: FunctionReference<"query">, args: any) {
657
- const serializedArgs = JSON.stringify(convexToJson(args));
658
- return this.queries[getFunctionName(query)]?.[serializedArgs];
659
- }
660
- }
661
-
662
- function getPaginatedQueryResults<
663
- Query extends PaginatedQueryReference,
664
- >(options: {
665
- localQueryStore: LocalQueryStoreFake;
666
- query: Query;
667
- argsToMatch?: Partial<PaginatedQueryArgs<Query>>;
668
- }) {
669
- const { localQueryStore, query, argsToMatch } = options;
670
- const allQueries = localQueryStore.getAllQueries(query);
671
- const relevantQueries = allQueries.filter((q) =>
672
- argsMatch({ args: q.args, ...(argsToMatch ? { argsToMatch } : {}) }),
673
- );
674
- const loadedQueries: Array<{
675
- args: FunctionArgs<Query>;
676
- value: FunctionReturnType<Query>;
677
- }> = [];
678
- for (const query of relevantQueries) {
679
- expect(query.value).toBeDefined();
680
- loadedQueries.push({ args: query.args, value: query.value! });
681
- }
682
- const firstPage = loadedQueries.find(
683
- (q) => q.args.paginationOpts.cursor === null,
684
- );
685
- if (!firstPage) {
686
- return [];
687
- }
688
- const sortedResults = [...firstPage.value.page];
689
- let currentCursor = firstPage.value.continueCursor;
690
- while (currentCursor !== null) {
691
- const nextPage = loadedQueries.find(
692
- (r) => r.args.paginationOpts.cursor === currentCursor,
693
- );
694
- if (nextPage === undefined) {
695
- break;
696
- }
697
- sortedResults.push(...nextPage.value.page);
698
- if (nextPage.value.isDone) {
699
- break;
700
- }
701
- currentCursor = nextPage.value.continueCursor;
702
- }
703
- return sortedResults;
704
- }
705
-
706
- function argsMatch<Query extends PaginatedQueryReference>(options: {
707
- args: FunctionArgs<Query>;
708
- argsToMatch?: Partial<PaginatedQueryArgs<Query>>;
709
- }) {
710
- if (options.argsToMatch === undefined) {
711
- return true;
712
- }
713
- return Object.keys(options.argsToMatch).every((key) => {
714
- // @ts-expect-error xcxc
715
- return compareValues(options.args[key], options.argsToMatch[key]) === 0;
716
- });
717
- }
718
- function setupPages<Query extends PaginatedQueryReference>(options: {
719
- localQueryStore: LocalQueryStoreFake;
720
- paginatedQuery: Query;
721
- args: PaginatedQueryArgs<Query>;
722
- pages: Array<Array<PaginatedQueryItem<Query>>>;
723
- isDone: boolean;
724
- }) {
725
- let currentCursor = null;
726
- for (let i = 0; i < options.pages.length; i++) {
727
- const page = options.pages[i];
728
- const nextCursor = `cursor${i}`;
729
- options.localQueryStore.setQuery(
730
- options.paginatedQuery,
731
- {
732
- ...options.args,
733
- paginationOpts: {
734
- cursor: currentCursor,
735
- id: JSON.stringify(options.args),
736
- numItems: 10,
737
- },
738
- },
739
- {
740
- page,
741
- continueCursor: nextCursor,
742
- isDone: i === options.pages.length - 1 ? options.isDone : false,
743
- },
744
- );
745
- currentCursor = nextCursor;
746
- }
747
- }
748
-
749
- describe("insertAtTop", () => {
750
- test("does not insert if the query is not loaded", () => {
751
- const localQueryStore = new LocalQueryStoreFake();
752
- const paginatedQuery = anyApi.messages.list;
753
-
754
- insertAtTop({
755
- paginatedQuery,
756
- localQueryStore,
757
- item: { author: "Sarah", content: "Hello, world!" },
758
- });
759
- expect(localQueryStore.getAllQueries(paginatedQuery).length).toBe(0);
760
- });
761
-
762
- test("inserts at top", () => {
763
- const localQueryStore = new LocalQueryStoreFake();
764
- const paginatedQuery: FunctionReference<
765
- "query",
766
- "public",
767
- { paginationOpts: PaginationOptions },
768
- PaginationResult<{ author: string; content: string }>
769
- > = anyApi.messages.list;
770
- setupPages({
771
- localQueryStore,
772
- paginatedQuery,
773
- args: {},
774
- pages: [
775
- [
776
- { author: "Alice", content: "Hello, world!" },
777
- { author: "Bob", content: "Hello, world!" },
778
- ],
779
- ],
780
- isDone: false,
781
- });
782
-
783
- insertAtTop({
784
- paginatedQuery,
785
- localQueryStore,
786
- item: { author: "Sarah", content: "Hello, world!" },
787
- });
788
- const sortedResults = getPaginatedQueryResults({
789
- localQueryStore,
790
- query: paginatedQuery,
791
- });
792
- expect(sortedResults).toEqual([
793
- { author: "Sarah", content: "Hello, world!" },
794
- { author: "Alice", content: "Hello, world!" },
795
- { author: "Bob", content: "Hello, world!" },
796
- ]);
797
- });
798
-
799
- test("inserts at top multiple pages", () => {
800
- const localQueryStore = new LocalQueryStoreFake();
801
- const paginatedQuery = anyApi.messages.list;
802
- setupPages({
803
- localQueryStore,
804
- paginatedQuery,
805
- args: {},
806
- pages: [
807
- [
808
- { author: "Alice", content: "Hello, world!" },
809
- { author: "Bob", content: "Hello, world!" },
810
- ],
811
- [
812
- { author: "Charlie", content: "Hello, world!" },
813
- { author: "Dave", content: "Hello, world!" },
814
- ],
815
- ],
816
- isDone: false,
817
- });
818
- insertAtTop({
819
- paginatedQuery,
820
- localQueryStore,
821
- item: { author: "Sarah", content: "Hello, world!" },
822
- });
823
- const sortedResults = getPaginatedQueryResults({
824
- localQueryStore,
825
- query: paginatedQuery,
826
- });
827
- expect(sortedResults).toEqual([
828
- { author: "Sarah", content: "Hello, world!" },
829
- { author: "Alice", content: "Hello, world!" },
830
- { author: "Bob", content: "Hello, world!" },
831
- { author: "Charlie", content: "Hello, world!" },
832
- { author: "Dave", content: "Hello, world!" },
833
- ]);
834
- });
835
-
836
- test("respects filters", () => {
837
- const localQueryStore = new LocalQueryStoreFake();
838
- const paginatedQuery = anyApi.messages.list;
839
- setupPages({
840
- localQueryStore,
841
- paginatedQuery,
842
- args: { channel: "general" },
843
- pages: [
844
- [
845
- { author: "Alice", content: "Hello, world!" },
846
- { author: "Bob", content: "Hello, world!" },
847
- ],
848
- ],
849
- isDone: false,
850
- });
851
- setupPages({
852
- localQueryStore,
853
- paginatedQuery,
854
- args: { channel: "marketing" },
855
- pages: [
856
- [
857
- { author: "Charlie", content: "Hello, world!" },
858
- { author: "Dave", content: "Hello, world!" },
859
- ],
860
- ],
861
- isDone: false,
862
- });
863
-
864
- insertAtTop({
865
- paginatedQuery,
866
- localQueryStore,
867
- argsToMatch: { channel: "general" },
868
- item: { author: "Sarah", content: "Hello, world!" },
869
- });
870
-
871
- const sortedResults = getPaginatedQueryResults({
872
- localQueryStore,
873
- query: paginatedQuery,
874
- argsToMatch: { channel: "general" },
875
- });
876
- expect(sortedResults).toEqual([
877
- { author: "Sarah", content: "Hello, world!" },
878
- { author: "Alice", content: "Hello, world!" },
879
- { author: "Bob", content: "Hello, world!" },
880
- ]);
881
- });
882
- });
883
-
884
- describe("insertAtPosition", () => {
885
- const defaultPages = [
886
- [
887
- { author: "Dave", rank: 40 },
888
- { author: "Charlie", rank: 30 },
889
- ],
890
- [
891
- { author: "Bob", rank: 20 },
892
- { author: "Alice", rank: 10 },
893
- ],
894
- ];
895
-
896
- describe("descending", () => {
897
- test("inserts in middle", () => {
898
- const localQueryStore = new LocalQueryStoreFake();
899
- const paginatedQuery = anyApi.messages.list;
900
- setupPages({
901
- localQueryStore,
902
- paginatedQuery,
903
- args: {},
904
- pages: defaultPages,
905
- isDone: false,
906
- });
907
- insertAtPosition({
908
- paginatedQuery,
909
- localQueryStore,
910
- item: { author: "Sarah", rank: 15 },
911
- sortOrder: "desc",
912
- sortKeyFromItem: (item) => item.rank,
913
- });
914
- const sortedResults = getPaginatedQueryResults({
915
- localQueryStore,
916
- query: paginatedQuery,
917
- });
918
- expect(sortedResults).toEqual([
919
- { author: "Dave", rank: 40 },
920
- { author: "Charlie", rank: 30 },
921
- { author: "Bob", rank: 20 },
922
- { author: "Sarah", rank: 15 },
923
- { author: "Alice", rank: 10 },
924
- ]);
925
- });
926
-
927
- test("inserts at top", () => {
928
- const localQueryStore = new LocalQueryStoreFake();
929
- const paginatedQuery = anyApi.messages.list;
930
- setupPages({
931
- localQueryStore,
932
- paginatedQuery,
933
- args: {},
934
- pages: defaultPages,
935
- isDone: false,
936
- });
937
- insertAtPosition({
938
- paginatedQuery,
939
- localQueryStore,
940
- item: { author: "Sarah", rank: 55 },
941
- sortOrder: "desc",
942
- sortKeyFromItem: (item) => item.rank,
943
- });
944
- const sortedResults = getPaginatedQueryResults({
945
- localQueryStore,
946
- query: paginatedQuery,
947
- });
948
- expect(sortedResults).toEqual([
949
- { author: "Sarah", rank: 55 },
950
- { author: "Dave", rank: 40 },
951
- { author: "Charlie", rank: 30 },
952
- { author: "Bob", rank: 20 },
953
- { author: "Alice", rank: 10 },
954
- ]);
955
- });
956
-
957
- test("inserts at bottom if list is done", () => {
958
- const localQueryStore = new LocalQueryStoreFake();
959
- const paginatedQuery = anyApi.messages.list;
960
- setupPages({
961
- localQueryStore,
962
- paginatedQuery,
963
- args: {},
964
- pages: defaultPages,
965
- isDone: true,
966
- });
967
- insertAtPosition({
968
- paginatedQuery,
969
- localQueryStore,
970
- item: { author: "Sarah", rank: 5 },
971
- sortOrder: "desc",
972
- sortKeyFromItem: (item) => item.rank,
973
- });
974
- const sortedResults = getPaginatedQueryResults({
975
- localQueryStore,
976
- query: paginatedQuery,
977
- });
978
- expect(sortedResults).toEqual([
979
- { author: "Dave", rank: 40 },
980
- { author: "Charlie", rank: 30 },
981
- { author: "Bob", rank: 20 },
982
- { author: "Alice", rank: 10 },
983
- { author: "Sarah", rank: 5 },
984
- ]);
985
- });
986
-
987
- test("does not insert at bottom if list is still loading", () => {
988
- const localQueryStore = new LocalQueryStoreFake();
989
- const paginatedQuery = anyApi.messages.list;
990
- setupPages({
991
- localQueryStore,
992
- paginatedQuery,
993
- args: {},
994
- pages: defaultPages,
995
- isDone: false,
996
- });
997
- insertAtPosition({
998
- paginatedQuery,
999
- localQueryStore,
1000
- item: { author: "Sarah", rank: 5 },
1001
- sortOrder: "desc",
1002
- sortKeyFromItem: (item) => item.rank,
1003
- });
1004
- const sortedResults = getPaginatedQueryResults({
1005
- localQueryStore,
1006
- query: paginatedQuery,
1007
- });
1008
- expect(sortedResults).toEqual([
1009
- { author: "Dave", rank: 40 },
1010
- { author: "Charlie", rank: 30 },
1011
- { author: "Bob", rank: 20 },
1012
- { author: "Alice", rank: 10 },
1013
- ]);
1014
- });
1015
-
1016
- test("inserts on page boundary", () => {
1017
- const localQueryStore = new LocalQueryStoreFake();
1018
- const paginatedQuery = anyApi.messages.list;
1019
- setupPages({
1020
- localQueryStore,
1021
- paginatedQuery,
1022
- args: {},
1023
- pages: defaultPages,
1024
- isDone: false,
1025
- });
1026
- insertAtPosition({
1027
- paginatedQuery,
1028
- localQueryStore,
1029
- item: { author: "Sarah", rank: 29 },
1030
- sortOrder: "desc",
1031
- sortKeyFromItem: (item) => item.rank,
1032
- });
1033
- const sortedResults = getPaginatedQueryResults({
1034
- localQueryStore,
1035
- query: paginatedQuery,
1036
- });
1037
- expect(sortedResults).toEqual([
1038
- { author: "Dave", rank: 40 },
1039
- { author: "Charlie", rank: 30 },
1040
- { author: "Sarah", rank: 29 },
1041
- { author: "Bob", rank: 20 },
1042
- { author: "Alice", rank: 10 },
1043
- ]);
1044
- });
1045
- });
1046
-
1047
- describe("ascending", () => {
1048
- const defaultPages = [
1049
- [
1050
- { author: "Alice", rank: 10 },
1051
- { author: "Bob", rank: 20 },
1052
- ],
1053
- [
1054
- { author: "Charlie", rank: 30 },
1055
- { author: "Dave", rank: 40 },
1056
- ],
1057
- ];
1058
- test("inserts in middle", () => {
1059
- const localQueryStore = new LocalQueryStoreFake();
1060
- const paginatedQuery = anyApi.messages.list;
1061
- setupPages({
1062
- localQueryStore,
1063
- paginatedQuery,
1064
- args: {},
1065
- pages: defaultPages,
1066
- isDone: false,
1067
- });
1068
- insertAtPosition({
1069
- paginatedQuery,
1070
- localQueryStore,
1071
- item: { author: "Sarah", rank: 15 },
1072
- sortOrder: "asc",
1073
- sortKeyFromItem: (item) => item.rank,
1074
- });
1075
- const sortedResults = getPaginatedQueryResults({
1076
- localQueryStore,
1077
- query: paginatedQuery,
1078
- });
1079
- expect(sortedResults).toEqual([
1080
- { author: "Alice", rank: 10 },
1081
- { author: "Sarah", rank: 15 },
1082
- { author: "Bob", rank: 20 },
1083
- { author: "Charlie", rank: 30 },
1084
- { author: "Dave", rank: 40 },
1085
- ]);
1086
- });
1087
-
1088
- test("inserts at top", () => {
1089
- const localQueryStore = new LocalQueryStoreFake();
1090
- const paginatedQuery = anyApi.messages.list;
1091
- setupPages({
1092
- localQueryStore,
1093
- paginatedQuery,
1094
- args: {},
1095
- pages: defaultPages,
1096
- isDone: false,
1097
- });
1098
- insertAtPosition({
1099
- paginatedQuery,
1100
- localQueryStore,
1101
- item: { author: "Sarah", rank: 5 },
1102
- sortOrder: "asc",
1103
- sortKeyFromItem: (item) => item.rank,
1104
- });
1105
- const sortedResults = getPaginatedQueryResults({
1106
- localQueryStore,
1107
- query: paginatedQuery,
1108
- });
1109
- expect(sortedResults).toEqual([
1110
- { author: "Sarah", rank: 5 },
1111
- { author: "Alice", rank: 10 },
1112
- { author: "Bob", rank: 20 },
1113
- { author: "Charlie", rank: 30 },
1114
- { author: "Dave", rank: 40 },
1115
- ]);
1116
- });
1117
-
1118
- test("inserts at bottom if list is done", () => {
1119
- const localQueryStore = new LocalQueryStoreFake();
1120
- const paginatedQuery = anyApi.messages.list;
1121
- setupPages({
1122
- localQueryStore,
1123
- paginatedQuery,
1124
- args: {},
1125
- pages: defaultPages,
1126
- isDone: true,
1127
- });
1128
- insertAtPosition({
1129
- paginatedQuery,
1130
- localQueryStore,
1131
- item: { author: "Sarah", rank: 50 },
1132
- sortOrder: "asc",
1133
- sortKeyFromItem: (item) => item.rank,
1134
- });
1135
- const sortedResults = getPaginatedQueryResults({
1136
- localQueryStore,
1137
- query: paginatedQuery,
1138
- });
1139
- expect(sortedResults).toEqual([
1140
- { author: "Alice", rank: 10 },
1141
- { author: "Bob", rank: 20 },
1142
- { author: "Charlie", rank: 30 },
1143
- { author: "Dave", rank: 40 },
1144
- { author: "Sarah", rank: 50 },
1145
- ]);
1146
- });
1147
-
1148
- test("does not insert at bottom if list is still loading", () => {
1149
- const localQueryStore = new LocalQueryStoreFake();
1150
- const paginatedQuery = anyApi.messages.list;
1151
- setupPages({
1152
- localQueryStore,
1153
- paginatedQuery,
1154
- args: {},
1155
- pages: defaultPages,
1156
- isDone: false,
1157
- });
1158
- insertAtPosition({
1159
- paginatedQuery,
1160
- localQueryStore,
1161
- item: { author: "Sarah", rank: 50 },
1162
- sortOrder: "asc",
1163
- sortKeyFromItem: (item) => item.rank,
1164
- });
1165
- const sortedResults = getPaginatedQueryResults({
1166
- localQueryStore,
1167
- query: paginatedQuery,
1168
- });
1169
- expect(sortedResults).toEqual([
1170
- { author: "Alice", rank: 10 },
1171
- { author: "Bob", rank: 20 },
1172
- { author: "Charlie", rank: 30 },
1173
- { author: "Dave", rank: 40 },
1174
- ]);
1175
- });
1176
-
1177
- test("inserts on page boundary", () => {
1178
- const localQueryStore = new LocalQueryStoreFake();
1179
- const paginatedQuery = anyApi.messages.list;
1180
- setupPages({
1181
- localQueryStore,
1182
- paginatedQuery,
1183
- args: {},
1184
- pages: defaultPages,
1185
- isDone: false,
1186
- });
1187
- insertAtPosition({
1188
- paginatedQuery,
1189
- localQueryStore,
1190
- item: { author: "Sarah", rank: 21 },
1191
- sortOrder: "asc",
1192
- sortKeyFromItem: (item) => item.rank,
1193
- });
1194
- const sortedResults = getPaginatedQueryResults({
1195
- localQueryStore,
1196
- query: paginatedQuery,
1197
- });
1198
- expect(sortedResults).toEqual([
1199
- { author: "Alice", rank: 10 },
1200
- { author: "Bob", rank: 20 },
1201
- { author: "Sarah", rank: 21 },
1202
- { author: "Charlie", rank: 30 },
1203
- { author: "Dave", rank: 40 },
1204
- ]);
1205
- });
1206
- });
1207
- });
1208
- },
1209
- );
1210
-
1211
- describe("usePaginatedQuery_experimental object form", () => {
1212
- test("Returns nothing when object-form args are 'skip'", () => {
1213
- const convexClient = new ConvexReactClient(address);
1214
- const subscriptionSpy = vi.spyOn(convexClient, "watchPaginatedQuery");
1215
- const wrapper = ({ children }: { children: React.ReactNode }) => (
1216
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
1217
- );
1218
-
1219
- const { result } = renderHook(
1220
- () =>
1221
- usePaginatedQuery_experimental({
1222
- query: makeFunctionReference<"query">("myQuery"),
1223
- args: "skip",
1224
- initialNumItems: 10,
1225
- }),
1226
- { wrapper },
1227
- );
1228
-
1229
- expect(subscriptionSpy.mock.calls).toEqual([]);
1230
- expect(result.current).toMatchObject({
1231
- isLoading: true,
1232
- data: undefined,
1233
- status: "pending",
1234
- canLoadMore: false,
1235
- });
1236
- });
1237
-
1238
- test("Initially returns pending for object options", () => {
1239
- const convexClient = new ConvexReactClient(address);
1240
- const wrapper = ({ children }: { children: React.ReactNode }) => (
1241
- <ConvexProvider client={convexClient}>{children}</ConvexProvider>
1242
- );
1243
-
1244
- const { result } = renderHook(
1245
- () =>
1246
- usePaginatedQuery_experimental({
1247
- query: makeFunctionReference<"query">("myQuery"),
1248
- args: {},
1249
- initialNumItems: 10,
1250
- }),
1251
- { wrapper },
1252
- );
1253
-
1254
- expect(result.current).toMatchObject({
1255
- isLoading: true,
1256
- data: undefined,
1257
- status: "pending",
1258
- canLoadMore: false,
1259
- });
1260
- });
1261
-
1262
- describe("object form with data", () => {
1263
- let client: ConvexReactClient;
1264
- const query: FunctionReference<"query"> = makeFunctionReference("myQuery");
1265
- const wrapper = ({ children }: { children: React.ReactNode }) => (
1266
- <ConvexProvider client={client}>{children}</ConvexProvider>
1267
- );
1268
-
1269
- const mockPage = (
1270
- opts: PaginationOptions,
1271
- retval: PaginationResult<unknown>,
1272
- ) => {
1273
- act(() => {
1274
- void client.mutation(
1275
- anyApi.myMutation.default,
1276
- {},
1277
- {
1278
- optimisticUpdate: (localStore) => {
1279
- localStore.setQuery(
1280
- anyApi.myQuery.default,
1281
- {
1282
- paginationOpts: { ...opts, id: 1 },
1283
- },
1284
- retval,
1285
- );
1286
- },
1287
- },
1288
- );
1289
- });
1290
- };
1291
-
1292
- beforeEach(() => {
1293
- client = new ConvexReactClient(address);
1294
- resetPaginatedId2();
1295
- });
1296
-
1297
- test("returns success with data for a single exhausted page", () => {
1298
- const { result } = renderHook(
1299
- () =>
1300
- usePaginatedQuery_experimental({
1301
- query,
1302
- args: {},
1303
- initialNumItems: 5,
1304
- }),
1305
- { wrapper },
1306
- );
1307
-
1308
- expect(result.current.status).toBe("pending");
1309
-
1310
- mockPage(
1311
- { numItems: 5, cursor: null },
1312
- { page: ["a", "b", "c"], continueCursor: "end", isDone: true },
1313
- );
1314
-
1315
- expect(result.current).toMatchObject({
1316
- status: "success",
1317
- data: ["a", "b", "c"],
1318
- canLoadMore: false,
1319
- isLoading: false,
1320
- error: undefined,
1321
- });
1322
- });
1323
-
1324
- test("returns success with canLoadMore true when more pages exist", () => {
1325
- const { result } = renderHook(
1326
- () =>
1327
- usePaginatedQuery_experimental({
1328
- query,
1329
- args: {},
1330
- initialNumItems: 2,
1331
- }),
1332
- { wrapper },
1333
- );
1334
-
1335
- mockPage(
1336
- { numItems: 2, cursor: null },
1337
- { page: ["item1", "item2"], continueCursor: "cur1", isDone: false },
1338
- );
1339
-
1340
- expect(result.current).toMatchObject({
1341
- status: "success",
1342
- data: ["item1", "item2"],
1343
- canLoadMore: true,
1344
- isLoading: false,
1345
- error: undefined,
1346
- });
1347
- });
1348
-
1349
- test("loadMore appends data and transitions to exhausted", () => {
1350
- const { result } = renderHook(
1351
- () =>
1352
- usePaginatedQuery_experimental({
1353
- query,
1354
- args: {},
1355
- initialNumItems: 1,
1356
- }),
1357
- { wrapper },
1358
- );
1359
-
1360
- mockPage(
1361
- { numItems: 1, cursor: null },
1362
- { page: ["first"], continueCursor: "abc", isDone: false },
1363
- );
1364
-
1365
- expect(result.current).toMatchObject({
1366
- status: "success",
1367
- data: ["first"],
1368
- canLoadMore: true,
1369
- });
1370
-
1371
- mockPage(
1372
- { numItems: 2, cursor: "abc" },
1373
- { page: ["second"], continueCursor: "def", isDone: true },
1374
- );
1375
- act(() => {
1376
- result.current.loadMore(2);
1377
- });
1378
-
1379
- expect(result.current).toMatchObject({
1380
- status: "success",
1381
- data: ["first", "second"],
1382
- canLoadMore: false,
1383
- isLoading: false,
1384
- });
1385
- });
1386
-
1387
- test("page updates reflect in data", () => {
1388
- const { result } = renderHook(
1389
- () =>
1390
- usePaginatedQuery_experimental({
1391
- query,
1392
- args: {},
1393
- initialNumItems: 5,
1394
- }),
1395
- { wrapper },
1396
- );
1397
-
1398
- mockPage(
1399
- { numItems: 5, cursor: null },
1400
- { page: ["old"], continueCursor: "c1", isDone: true },
1401
- );
1402
-
1403
- expect(result.current).toMatchObject({
1404
- status: "success",
1405
- data: ["old"],
1406
- });
1407
-
1408
- mockPage(
1409
- { numItems: 5, cursor: null },
1410
- { page: ["new1", "new2"], continueCursor: "c2", isDone: true },
1411
- );
1412
-
1413
- expect(result.current).toMatchObject({
1414
- status: "success",
1415
- data: ["new1", "new2"],
1416
- canLoadMore: false,
1417
- });
1418
- });
1419
- });
1420
- });