on-zero 0.7.10 → 0.8.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 (546) hide show
  1. package/{readme.md → README.md} +172 -231
  2. package/dist/cjs/cli.cjs +5 -2
  3. package/dist/cjs/cli.native.js +5 -2
  4. package/dist/cjs/cli.native.js.map +1 -1
  5. package/dist/cjs/combineZeroClients.cjs +2 -2
  6. package/dist/cjs/combineZeroClients.native.js +6 -6
  7. package/dist/cjs/combineZeroClients.native.js.map +1 -1
  8. package/dist/cjs/config.cjs +30 -0
  9. package/dist/cjs/config.native.js +33 -0
  10. package/dist/cjs/config.native.js.map +1 -0
  11. package/dist/cjs/createPermissions.cjs +2 -2
  12. package/dist/cjs/createPermissions.native.js +17 -27
  13. package/dist/cjs/createPermissions.native.js.map +1 -1
  14. package/dist/cjs/createUseQuery.cjs +3 -3
  15. package/dist/cjs/createUseQuery.native.js +4 -4
  16. package/dist/cjs/createUseQuery.native.js.map +1 -1
  17. package/dist/cjs/createUseQueryDirect.cjs +4 -3
  18. package/dist/cjs/createUseQueryDirect.native.js +14 -18
  19. package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
  20. package/dist/cjs/createZeroClient.cjs +29 -9
  21. package/dist/cjs/createZeroClient.connection.test.cjs +11 -0
  22. package/dist/cjs/createZeroClient.connection.test.native.js +14 -7
  23. package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -1
  24. package/dist/cjs/createZeroClient.native.js +58 -32
  25. package/dist/cjs/createZeroClient.native.js.map +1 -1
  26. package/dist/cjs/createZeroClient.recovery.test.cjs +90 -3
  27. package/dist/cjs/createZeroClient.recovery.test.native.js +109 -19
  28. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
  29. package/dist/cjs/generate-helpers.cjs +70 -17
  30. package/dist/cjs/generate-helpers.native.js +110 -23
  31. package/dist/cjs/generate-helpers.native.js.map +1 -1
  32. package/dist/cjs/generate-layout.cjs +586 -0
  33. package/dist/cjs/generate-layout.native.js +1275 -0
  34. package/dist/cjs/generate-layout.native.js.map +1 -0
  35. package/dist/cjs/generate-lite.cjs +295 -27
  36. package/dist/cjs/generate-lite.native.js +854 -102
  37. package/dist/cjs/generate-lite.native.js.map +1 -1
  38. package/dist/cjs/generate-lite.test.cjs +433 -41
  39. package/dist/cjs/generate-lite.test.native.js +446 -41
  40. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  41. package/dist/cjs/generate.cjs +172 -94
  42. package/dist/cjs/generate.native.js +324 -148
  43. package/dist/cjs/generate.native.js.map +1 -1
  44. package/dist/cjs/generate.test.cjs +362 -45
  45. package/dist/cjs/generate.test.native.js +374 -45
  46. package/dist/cjs/generate.test.native.js.map +1 -1
  47. package/dist/cjs/helpers/NullToOptional.cjs +18 -0
  48. package/dist/cjs/helpers/NullToOptional.native.js +21 -0
  49. package/dist/cjs/helpers/NullToOptional.native.js.map +1 -0
  50. package/dist/cjs/helpers/asyncContext.cjs +128 -0
  51. package/dist/cjs/helpers/asyncContext.native.js +87 -0
  52. package/dist/cjs/helpers/asyncContext.native.js.map +1 -0
  53. package/dist/cjs/helpers/batchQuery.cjs +2 -2
  54. package/dist/cjs/helpers/batchQuery.native.js +2 -2
  55. package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
  56. package/dist/cjs/helpers/createMutators.cjs +7 -4
  57. package/dist/cjs/helpers/createMutators.native.js +12 -9
  58. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  59. package/dist/cjs/helpers/createMutators.test.native.js +2 -2
  60. package/dist/cjs/helpers/createMutators.test.native.js.map +1 -1
  61. package/dist/cjs/helpers/ellipsis.cjs +35 -0
  62. package/dist/cjs/helpers/ellipsis.native.js +38 -0
  63. package/dist/cjs/helpers/ellipsis.native.js.map +1 -0
  64. package/dist/cjs/helpers/emitter.cjs +99 -0
  65. package/dist/cjs/helpers/emitter.native.js +125 -0
  66. package/dist/cjs/helpers/emitter.native.js.map +1 -0
  67. package/dist/cjs/helpers/ensure.cjs +33 -0
  68. package/dist/cjs/helpers/ensure.native.js +37 -0
  69. package/dist/cjs/helpers/ensure.native.js.map +1 -0
  70. package/dist/cjs/helpers/ensureLoggedIn.cjs +2 -2
  71. package/dist/cjs/helpers/ensureLoggedIn.native.js +3 -3
  72. package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
  73. package/dist/cjs/helpers/errors.cjs +40 -0
  74. package/dist/cjs/helpers/errors.native.js +152 -0
  75. package/dist/cjs/helpers/errors.native.js.map +1 -0
  76. package/dist/cjs/helpers/getCurrentComponentStack.cjs +71 -0
  77. package/dist/cjs/helpers/getCurrentComponentStack.native.js +93 -0
  78. package/dist/cjs/helpers/getCurrentComponentStack.native.js.map +1 -0
  79. package/dist/cjs/helpers/globalValue.cjs +39 -0
  80. package/dist/cjs/helpers/globalValue.native.js +42 -0
  81. package/dist/cjs/helpers/globalValue.native.js.map +1 -0
  82. package/dist/cjs/helpers/mapObject.cjs +36 -0
  83. package/dist/cjs/helpers/mapObject.native.js +39 -0
  84. package/dist/cjs/helpers/mapObject.native.js.map +1 -0
  85. package/dist/cjs/helpers/mutationLifecycle.cjs +251 -0
  86. package/dist/cjs/helpers/mutationLifecycle.native.js +392 -0
  87. package/dist/cjs/helpers/mutationLifecycle.native.js.map +1 -0
  88. package/dist/cjs/helpers/mutationLifecycle.test.cjs +174 -0
  89. package/dist/cjs/helpers/mutationLifecycle.test.native.js +182 -0
  90. package/dist/cjs/helpers/mutationLifecycle.test.native.js.map +1 -0
  91. package/dist/cjs/helpers/mutatorContext.cjs +3 -3
  92. package/dist/cjs/helpers/mutatorContext.native.js +5 -5
  93. package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
  94. package/dist/cjs/helpers/platform.cjs +31 -0
  95. package/dist/cjs/helpers/platform.native.js +33 -0
  96. package/dist/cjs/helpers/platform.native.js.map +1 -0
  97. package/dist/cjs/helpers/prettyFormatZeroQuery.cjs +2 -2
  98. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js +7 -7
  99. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  100. package/dist/cjs/helpers/queryContext.cjs +2 -2
  101. package/dist/cjs/helpers/queryContext.native.js +4 -4
  102. package/dist/cjs/helpers/queryContext.native.js.map +1 -1
  103. package/dist/cjs/helpers/recoverZeroClient.cjs +14 -15
  104. package/dist/cjs/helpers/recoverZeroClient.native.js +26 -23
  105. package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
  106. package/dist/cjs/helpers/recoverZeroClient.test.cjs +10 -8
  107. package/dist/cjs/helpers/recoverZeroClient.test.native.js +17 -21
  108. package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
  109. package/dist/cjs/helpers/sleep.cjs +34 -0
  110. package/dist/cjs/helpers/sleep.native.js +39 -0
  111. package/dist/cjs/helpers/sleep.native.js.map +1 -0
  112. package/dist/cjs/helpers/time.cjs +47 -0
  113. package/dist/cjs/helpers/time.native.js +80 -0
  114. package/dist/cjs/helpers/time.native.js.map +1 -0
  115. package/dist/cjs/helpers/tuple.cjs +18 -0
  116. package/dist/cjs/helpers/tuple.native.js +21 -0
  117. package/dist/cjs/helpers/tuple.native.js.map +1 -0
  118. package/dist/cjs/helpers/useMutation.native.js +5 -5
  119. package/dist/cjs/helpers/useMutation.native.js.map +1 -1
  120. package/dist/cjs/helpers/useMutation.test.native.js +1 -1
  121. package/dist/cjs/helpers/useMutation.test.native.js.map +1 -1
  122. package/dist/cjs/helpers/useZeroDebug.cjs +2 -2
  123. package/dist/cjs/helpers/useZeroDebug.native.js +7 -8
  124. package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
  125. package/dist/cjs/index.cjs +9 -1
  126. package/dist/cjs/index.native.js +8 -0
  127. package/dist/cjs/index.native.js.map +1 -1
  128. package/dist/cjs/instanceRegistry.cjs +16 -4
  129. package/dist/cjs/instanceRegistry.native.js +56 -6
  130. package/dist/cjs/instanceRegistry.native.js.map +1 -1
  131. package/dist/cjs/multi.cjs +34 -13
  132. package/dist/cjs/multi.native.js +39 -17
  133. package/dist/cjs/multi.native.js.map +1 -1
  134. package/dist/cjs/multiInstance.test.cjs +6 -2
  135. package/dist/cjs/multiInstance.test.native.js +13 -9
  136. package/dist/cjs/multiInstance.test.native.js.map +1 -1
  137. package/dist/cjs/multiInstanceNested.test.native.js +10 -10
  138. package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
  139. package/dist/cjs/multiPartition.test.cjs +85 -36
  140. package/dist/cjs/multiPartition.test.native.js +102 -39
  141. package/dist/cjs/multiPartition.test.native.js.map +1 -1
  142. package/dist/cjs/mutations.cjs +2 -2
  143. package/dist/cjs/mutations.native.js +4 -4
  144. package/dist/cjs/mutations.native.js.map +1 -1
  145. package/dist/cjs/mutations.test.native.js +3 -3
  146. package/dist/cjs/mutations.test.native.js.map +1 -1
  147. package/dist/cjs/provideZero.hydration.test.cjs +3 -3
  148. package/dist/cjs/provideZero.hydration.test.native.js +4 -4
  149. package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
  150. package/dist/cjs/run.cjs +1 -1
  151. package/dist/cjs/run.native.js +3 -3
  152. package/dist/cjs/run.native.js.map +1 -1
  153. package/dist/cjs/server.cjs +20 -16
  154. package/dist/cjs/server.native.js +50 -57
  155. package/dist/cjs/server.native.js.map +1 -1
  156. package/dist/cjs/server.test.cjs +129 -6
  157. package/dist/cjs/server.test.native.js +141 -10
  158. package/dist/cjs/server.test.native.js.map +1 -1
  159. package/dist/cjs/serverWhere.test.native.js +3 -3
  160. package/dist/cjs/serverWhere.test.native.js.map +1 -1
  161. package/dist/cjs/state.cjs +2 -2
  162. package/dist/cjs/state.native.js +10 -10
  163. package/dist/cjs/state.native.js.map +1 -1
  164. package/dist/cjs/usePermission.test.native.js +3 -3
  165. package/dist/cjs/usePermission.test.native.js.map +1 -1
  166. package/dist/cjs/useQuery.empty.test.cjs +3 -3
  167. package/dist/cjs/useQuery.empty.test.native.js +6 -6
  168. package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
  169. package/dist/cjs/useQuery.ssr.test.native.js +2 -2
  170. package/dist/cjs/useQuery.ssr.test.native.js.map +1 -1
  171. package/dist/cjs/vite-plugin.cjs +7 -8
  172. package/dist/cjs/vite-plugin.native.js +11 -11
  173. package/dist/cjs/vite-plugin.native.js.map +1 -1
  174. package/dist/cjs/where.cjs +3 -3
  175. package/dist/cjs/where.native.js +4 -4
  176. package/dist/cjs/where.native.js.map +1 -1
  177. package/dist/esm/cli.mjs +6 -3
  178. package/dist/esm/cli.mjs.map +1 -1
  179. package/dist/esm/cli.native.js +6 -3
  180. package/dist/esm/cli.native.js.map +1 -1
  181. package/dist/esm/combineZeroClients.mjs +1 -1
  182. package/dist/esm/combineZeroClients.mjs.map +1 -1
  183. package/dist/esm/combineZeroClients.native.js +5 -5
  184. package/dist/esm/combineZeroClients.native.js.map +1 -1
  185. package/dist/esm/config.mjs +5 -0
  186. package/dist/esm/config.mjs.map +1 -0
  187. package/dist/esm/config.native.js +5 -0
  188. package/dist/esm/config.native.js.map +1 -0
  189. package/dist/esm/createPermissions.mjs +1 -1
  190. package/dist/esm/createPermissions.mjs.map +1 -1
  191. package/dist/esm/createPermissions.native.js +16 -26
  192. package/dist/esm/createPermissions.native.js.map +1 -1
  193. package/dist/esm/createUseQuery.mjs +2 -2
  194. package/dist/esm/createUseQuery.mjs.map +1 -1
  195. package/dist/esm/createUseQuery.native.js +3 -3
  196. package/dist/esm/createUseQuery.native.js.map +1 -1
  197. package/dist/esm/createUseQueryDirect.mjs +2 -1
  198. package/dist/esm/createUseQueryDirect.mjs.map +1 -1
  199. package/dist/esm/createUseQueryDirect.native.js +12 -16
  200. package/dist/esm/createUseQueryDirect.native.js.map +1 -1
  201. package/dist/esm/createZeroClient.connection.test.mjs +11 -0
  202. package/dist/esm/createZeroClient.connection.test.mjs.map +1 -1
  203. package/dist/esm/createZeroClient.connection.test.native.js +14 -7
  204. package/dist/esm/createZeroClient.connection.test.native.js.map +1 -1
  205. package/dist/esm/createZeroClient.mjs +25 -5
  206. package/dist/esm/createZeroClient.mjs.map +1 -1
  207. package/dist/esm/createZeroClient.native.js +54 -28
  208. package/dist/esm/createZeroClient.native.js.map +1 -1
  209. package/dist/esm/createZeroClient.recovery.test.mjs +90 -3
  210. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
  211. package/dist/esm/createZeroClient.recovery.test.native.js +109 -19
  212. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
  213. package/dist/esm/generate-helpers.mjs +70 -18
  214. package/dist/esm/generate-helpers.mjs.map +1 -1
  215. package/dist/esm/generate-helpers.native.js +110 -24
  216. package/dist/esm/generate-helpers.native.js.map +1 -1
  217. package/dist/esm/generate-layout.mjs +560 -0
  218. package/dist/esm/generate-layout.mjs.map +1 -0
  219. package/dist/esm/generate-layout.native.js +1246 -0
  220. package/dist/esm/generate-layout.native.js.map +1 -0
  221. package/dist/esm/generate-lite.mjs +296 -28
  222. package/dist/esm/generate-lite.mjs.map +1 -1
  223. package/dist/esm/generate-lite.native.js +855 -103
  224. package/dist/esm/generate-lite.native.js.map +1 -1
  225. package/dist/esm/generate-lite.test.mjs +434 -42
  226. package/dist/esm/generate-lite.test.mjs.map +1 -1
  227. package/dist/esm/generate-lite.test.native.js +447 -42
  228. package/dist/esm/generate-lite.test.native.js.map +1 -1
  229. package/dist/esm/generate.mjs +172 -96
  230. package/dist/esm/generate.mjs.map +1 -1
  231. package/dist/esm/generate.native.js +324 -150
  232. package/dist/esm/generate.native.js.map +1 -1
  233. package/dist/esm/generate.test.mjs +366 -49
  234. package/dist/esm/generate.test.mjs.map +1 -1
  235. package/dist/esm/generate.test.native.js +378 -49
  236. package/dist/esm/generate.test.native.js.map +1 -1
  237. package/dist/esm/helpers/NullToOptional.mjs +2 -0
  238. package/dist/esm/helpers/NullToOptional.mjs.map +1 -0
  239. package/dist/esm/helpers/NullToOptional.native.js +2 -0
  240. package/dist/esm/helpers/NullToOptional.native.js.map +1 -0
  241. package/dist/esm/helpers/asyncContext.mjs +102 -0
  242. package/dist/esm/helpers/asyncContext.mjs.map +1 -0
  243. package/dist/esm/helpers/asyncContext.native.js +58 -0
  244. package/dist/esm/helpers/asyncContext.native.js.map +1 -0
  245. package/dist/esm/helpers/batchQuery.mjs +1 -1
  246. package/dist/esm/helpers/batchQuery.native.js +1 -1
  247. package/dist/esm/helpers/createMutators.mjs +5 -2
  248. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  249. package/dist/esm/helpers/createMutators.native.js +10 -7
  250. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  251. package/dist/esm/helpers/createMutators.test.native.js +2 -2
  252. package/dist/esm/helpers/createMutators.test.native.js.map +1 -1
  253. package/dist/esm/helpers/ellipsis.mjs +10 -0
  254. package/dist/esm/helpers/ellipsis.mjs.map +1 -0
  255. package/dist/esm/helpers/ellipsis.native.js +10 -0
  256. package/dist/esm/helpers/ellipsis.native.js.map +1 -0
  257. package/dist/esm/helpers/emitter.mjs +72 -0
  258. package/dist/esm/helpers/emitter.mjs.map +1 -0
  259. package/dist/esm/helpers/emitter.native.js +95 -0
  260. package/dist/esm/helpers/emitter.native.js.map +1 -0
  261. package/dist/esm/helpers/ensure.mjs +8 -0
  262. package/dist/esm/helpers/ensure.mjs.map +1 -0
  263. package/dist/esm/helpers/ensure.native.js +9 -0
  264. package/dist/esm/helpers/ensure.native.js.map +1 -0
  265. package/dist/esm/helpers/ensureLoggedIn.mjs +1 -1
  266. package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
  267. package/dist/esm/helpers/ensureLoggedIn.native.js +2 -2
  268. package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
  269. package/dist/esm/helpers/errors.mjs +14 -0
  270. package/dist/esm/helpers/errors.mjs.map +1 -0
  271. package/dist/esm/helpers/errors.native.js +123 -0
  272. package/dist/esm/helpers/errors.native.js.map +1 -0
  273. package/dist/esm/helpers/getCurrentComponentStack.mjs +35 -0
  274. package/dist/esm/helpers/getCurrentComponentStack.mjs.map +1 -0
  275. package/dist/esm/helpers/getCurrentComponentStack.native.js +54 -0
  276. package/dist/esm/helpers/getCurrentComponentStack.native.js.map +1 -0
  277. package/dist/esm/helpers/globalValue.mjs +14 -0
  278. package/dist/esm/helpers/globalValue.mjs.map +1 -0
  279. package/dist/esm/helpers/globalValue.native.js +14 -0
  280. package/dist/esm/helpers/globalValue.native.js.map +1 -0
  281. package/dist/esm/helpers/mapObject.mjs +11 -0
  282. package/dist/esm/helpers/mapObject.mjs.map +1 -0
  283. package/dist/esm/helpers/mapObject.native.js +11 -0
  284. package/dist/esm/helpers/mapObject.native.js.map +1 -0
  285. package/dist/esm/helpers/mutationLifecycle.mjs +221 -0
  286. package/dist/esm/helpers/mutationLifecycle.mjs.map +1 -0
  287. package/dist/esm/helpers/mutationLifecycle.native.js +359 -0
  288. package/dist/esm/helpers/mutationLifecycle.native.js.map +1 -0
  289. package/dist/esm/helpers/mutationLifecycle.test.mjs +175 -0
  290. package/dist/esm/helpers/mutationLifecycle.test.mjs.map +1 -0
  291. package/dist/esm/helpers/mutationLifecycle.test.native.js +180 -0
  292. package/dist/esm/helpers/mutationLifecycle.test.native.js.map +1 -0
  293. package/dist/esm/helpers/mutatorContext.mjs +1 -1
  294. package/dist/esm/helpers/mutatorContext.native.js +4 -4
  295. package/dist/esm/helpers/mutatorContext.native.js.map +1 -1
  296. package/dist/esm/helpers/platform.mjs +5 -0
  297. package/dist/esm/helpers/platform.mjs.map +1 -0
  298. package/dist/esm/helpers/platform.native.js +4 -0
  299. package/dist/esm/helpers/platform.native.js.map +1 -0
  300. package/dist/esm/helpers/prettyFormatZeroQuery.mjs +1 -1
  301. package/dist/esm/helpers/prettyFormatZeroQuery.native.js +6 -6
  302. package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  303. package/dist/esm/helpers/queryContext.mjs +1 -1
  304. package/dist/esm/helpers/queryContext.native.js +3 -3
  305. package/dist/esm/helpers/queryContext.native.js.map +1 -1
  306. package/dist/esm/helpers/recoverZeroClient.mjs +14 -15
  307. package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
  308. package/dist/esm/helpers/recoverZeroClient.native.js +26 -23
  309. package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
  310. package/dist/esm/helpers/recoverZeroClient.test.mjs +8 -6
  311. package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
  312. package/dist/esm/helpers/recoverZeroClient.test.native.js +15 -19
  313. package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
  314. package/dist/esm/helpers/sleep.mjs +9 -0
  315. package/dist/esm/helpers/sleep.mjs.map +1 -0
  316. package/dist/esm/helpers/sleep.native.js +11 -0
  317. package/dist/esm/helpers/sleep.native.js.map +1 -0
  318. package/dist/esm/helpers/time.mjs +22 -0
  319. package/dist/esm/helpers/time.mjs.map +1 -0
  320. package/dist/esm/helpers/time.native.js +52 -0
  321. package/dist/esm/helpers/time.native.js.map +1 -0
  322. package/dist/esm/helpers/tuple.mjs +2 -0
  323. package/dist/esm/helpers/tuple.mjs.map +1 -0
  324. package/dist/esm/helpers/tuple.native.js +2 -0
  325. package/dist/esm/helpers/tuple.native.js.map +1 -0
  326. package/dist/esm/helpers/useMutation.native.js +5 -5
  327. package/dist/esm/helpers/useMutation.native.js.map +1 -1
  328. package/dist/esm/helpers/useMutation.test.native.js +1 -1
  329. package/dist/esm/helpers/useMutation.test.native.js.map +1 -1
  330. package/dist/esm/helpers/useZeroDebug.mjs +1 -1
  331. package/dist/esm/helpers/useZeroDebug.mjs.map +1 -1
  332. package/dist/esm/helpers/useZeroDebug.native.js +6 -7
  333. package/dist/esm/helpers/useZeroDebug.native.js.map +1 -1
  334. package/dist/esm/index.js +3 -1
  335. package/dist/esm/index.js.map +1 -1
  336. package/dist/esm/index.mjs +3 -1
  337. package/dist/esm/index.mjs.map +1 -1
  338. package/dist/esm/index.native.js +3 -1
  339. package/dist/esm/index.native.js.map +1 -1
  340. package/dist/esm/instanceRegistry.mjs +13 -2
  341. package/dist/esm/instanceRegistry.mjs.map +1 -1
  342. package/dist/esm/instanceRegistry.native.js +53 -4
  343. package/dist/esm/instanceRegistry.native.js.map +1 -1
  344. package/dist/esm/multi.mjs +33 -12
  345. package/dist/esm/multi.mjs.map +1 -1
  346. package/dist/esm/multi.native.js +38 -16
  347. package/dist/esm/multi.native.js.map +1 -1
  348. package/dist/esm/multiInstance.test.mjs +5 -1
  349. package/dist/esm/multiInstance.test.mjs.map +1 -1
  350. package/dist/esm/multiInstance.test.native.js +12 -8
  351. package/dist/esm/multiInstance.test.native.js.map +1 -1
  352. package/dist/esm/multiInstanceNested.test.native.js +10 -10
  353. package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
  354. package/dist/esm/multiPartition.test.mjs +86 -37
  355. package/dist/esm/multiPartition.test.mjs.map +1 -1
  356. package/dist/esm/multiPartition.test.native.js +103 -40
  357. package/dist/esm/multiPartition.test.native.js.map +1 -1
  358. package/dist/esm/mutations.mjs +1 -1
  359. package/dist/esm/mutations.mjs.map +1 -1
  360. package/dist/esm/mutations.native.js +3 -3
  361. package/dist/esm/mutations.native.js.map +1 -1
  362. package/dist/esm/mutations.test.native.js +3 -3
  363. package/dist/esm/mutations.test.native.js.map +1 -1
  364. package/dist/esm/provideZero.hydration.test.mjs +1 -1
  365. package/dist/esm/provideZero.hydration.test.mjs.map +1 -1
  366. package/dist/esm/provideZero.hydration.test.native.js +2 -2
  367. package/dist/esm/provideZero.hydration.test.native.js.map +1 -1
  368. package/dist/esm/run.mjs +1 -1
  369. package/dist/esm/run.mjs.map +1 -1
  370. package/dist/esm/run.native.js +3 -3
  371. package/dist/esm/run.native.js.map +1 -1
  372. package/dist/esm/server.mjs +20 -15
  373. package/dist/esm/server.mjs.map +1 -1
  374. package/dist/esm/server.native.js +50 -56
  375. package/dist/esm/server.native.js.map +1 -1
  376. package/dist/esm/server.test.mjs +130 -7
  377. package/dist/esm/server.test.mjs.map +1 -1
  378. package/dist/esm/server.test.native.js +142 -11
  379. package/dist/esm/server.test.native.js.map +1 -1
  380. package/dist/esm/serverWhere.test.mjs.map +1 -1
  381. package/dist/esm/serverWhere.test.native.js +3 -3
  382. package/dist/esm/serverWhere.test.native.js.map +1 -1
  383. package/dist/esm/state.mjs +1 -1
  384. package/dist/esm/state.mjs.map +1 -1
  385. package/dist/esm/state.native.js +9 -9
  386. package/dist/esm/state.native.js.map +1 -1
  387. package/dist/esm/usePermission.test.native.js +3 -3
  388. package/dist/esm/usePermission.test.native.js.map +1 -1
  389. package/dist/esm/useQuery.empty.test.mjs +1 -1
  390. package/dist/esm/useQuery.empty.test.mjs.map +1 -1
  391. package/dist/esm/useQuery.empty.test.native.js +4 -4
  392. package/dist/esm/useQuery.empty.test.native.js.map +1 -1
  393. package/dist/esm/useQuery.ssr.test.native.js +2 -2
  394. package/dist/esm/useQuery.ssr.test.native.js.map +1 -1
  395. package/dist/esm/vite-plugin.mjs +7 -8
  396. package/dist/esm/vite-plugin.mjs.map +1 -1
  397. package/dist/esm/vite-plugin.native.js +11 -11
  398. package/dist/esm/vite-plugin.native.js.map +1 -1
  399. package/dist/esm/where.mjs +1 -1
  400. package/dist/esm/where.mjs.map +1 -1
  401. package/dist/esm/where.native.js +2 -2
  402. package/dist/esm/where.native.js.map +1 -1
  403. package/package.json +18 -6
  404. package/src/cli.ts +11 -3
  405. package/src/combineZeroClients.tsx +18 -10
  406. package/src/config.ts +72 -0
  407. package/src/createPermissions.ts +3 -4
  408. package/src/createUseQuery.tsx +8 -8
  409. package/src/createUseQueryDirect.tsx +11 -10
  410. package/src/createZeroClient.authData.test.tsx +1 -1
  411. package/src/createZeroClient.connection.test.tsx +13 -2
  412. package/src/createZeroClient.recovery.test.tsx +100 -4
  413. package/src/createZeroClient.tsx +87 -30
  414. package/src/generate-helpers.ts +108 -31
  415. package/src/generate-layout.ts +841 -0
  416. package/src/generate-lite.test.ts +421 -42
  417. package/src/generate-lite.ts +479 -43
  418. package/src/generate.test.ts +552 -90
  419. package/src/generate.ts +360 -163
  420. package/src/helpers/NullToOptional.ts +5 -0
  421. package/src/helpers/asyncContext.native.ts +90 -0
  422. package/src/helpers/asyncContext.ts +159 -0
  423. package/src/helpers/batchQuery.ts +2 -2
  424. package/src/helpers/createMutators.ts +11 -8
  425. package/src/helpers/ellipsis.ts +9 -0
  426. package/src/helpers/emitter.tsx +106 -0
  427. package/src/helpers/ensure.ts +10 -0
  428. package/src/helpers/ensureLoggedIn.ts +1 -2
  429. package/src/helpers/errors.ts +13 -0
  430. package/src/helpers/getCurrentComponentStack.ts +56 -0
  431. package/src/helpers/globalValue.ts +40 -0
  432. package/src/helpers/mapObject.ts +14 -0
  433. package/src/helpers/mutationLifecycle.test.ts +180 -0
  434. package/src/helpers/mutationLifecycle.ts +313 -0
  435. package/src/helpers/mutatorContext.ts +3 -3
  436. package/src/helpers/platform.native.ts +2 -0
  437. package/src/helpers/platform.ts +16 -0
  438. package/src/helpers/prettyFormatZeroQuery.ts +2 -2
  439. package/src/helpers/queryContext.ts +2 -2
  440. package/src/helpers/recoverZeroClient.test.ts +23 -21
  441. package/src/helpers/recoverZeroClient.ts +56 -49
  442. package/src/helpers/sleep.ts +8 -0
  443. package/src/helpers/time.ts +51 -0
  444. package/src/helpers/tuple.ts +1 -0
  445. package/src/helpers/useMutation.tsx +3 -3
  446. package/src/helpers/useZeroDebug.ts +3 -3
  447. package/src/index.ts +13 -1
  448. package/src/instanceRegistry.ts +19 -6
  449. package/src/multi.ts +75 -31
  450. package/src/multiInstance.test.tsx +31 -13
  451. package/src/multiInstanceNested.test.tsx +2 -2
  452. package/src/multiPartition.test.ts +62 -27
  453. package/src/mutations.ts +10 -10
  454. package/src/provideZero.hydration.test.tsx +1 -1
  455. package/src/resolveQuery.ts +2 -2
  456. package/src/run.ts +7 -7
  457. package/src/server.test.ts +117 -18
  458. package/src/server.ts +70 -43
  459. package/src/serverWhere.ts +2 -2
  460. package/src/state.ts +2 -2
  461. package/src/types.ts +47 -6
  462. package/src/useQuery.empty.test.tsx +3 -3
  463. package/src/useQuery.ssr.test.ts +1 -1
  464. package/src/vite-plugin.ts +12 -9
  465. package/src/where.ts +6 -7
  466. package/src/zeroRunner.ts +2 -2
  467. package/types/combineZeroClients.d.ts +11 -5
  468. package/types/combineZeroClients.d.ts.map +1 -1
  469. package/types/config.d.ts +62 -0
  470. package/types/config.d.ts.map +1 -0
  471. package/types/createPermissions.d.ts.map +1 -1
  472. package/types/createUseQuery.d.ts.map +1 -1
  473. package/types/createUseQueryDirect.d.ts +1 -1
  474. package/types/createUseQueryDirect.d.ts.map +1 -1
  475. package/types/createZeroClient.d.ts +22 -12
  476. package/types/createZeroClient.d.ts.map +1 -1
  477. package/types/createZeroClient.recovery.test.d.ts.map +1 -1
  478. package/types/generate-helpers.d.ts +17 -2
  479. package/types/generate-helpers.d.ts.map +1 -1
  480. package/types/generate-layout.d.ts +26 -0
  481. package/types/generate-layout.d.ts.map +1 -0
  482. package/types/generate-lite.d.ts +29 -1
  483. package/types/generate-lite.d.ts.map +1 -1
  484. package/types/generate.d.ts +20 -0
  485. package/types/generate.d.ts.map +1 -1
  486. package/types/helpers/NullToOptional.d.ts +6 -0
  487. package/types/helpers/NullToOptional.d.ts.map +1 -0
  488. package/types/helpers/asyncContext.d.ts +15 -0
  489. package/types/helpers/asyncContext.d.ts.map +1 -0
  490. package/types/helpers/asyncContext.native.d.ts +8 -0
  491. package/types/helpers/asyncContext.native.d.ts.map +1 -0
  492. package/types/helpers/createMutators.d.ts +2 -1
  493. package/types/helpers/createMutators.d.ts.map +1 -1
  494. package/types/helpers/ellipsis.d.ts +2 -0
  495. package/types/helpers/ellipsis.d.ts.map +1 -0
  496. package/types/helpers/emitter.d.ts +21 -0
  497. package/types/helpers/emitter.d.ts.map +1 -0
  498. package/types/helpers/ensure.d.ts +2 -0
  499. package/types/helpers/ensure.d.ts.map +1 -0
  500. package/types/helpers/ensureLoggedIn.d.ts.map +1 -1
  501. package/types/helpers/errors.d.ts +7 -0
  502. package/types/helpers/errors.d.ts.map +1 -0
  503. package/types/helpers/getCurrentComponentStack.d.ts +2 -0
  504. package/types/helpers/getCurrentComponentStack.d.ts.map +1 -0
  505. package/types/helpers/globalValue.d.ts +23 -0
  506. package/types/helpers/globalValue.d.ts.map +1 -0
  507. package/types/helpers/mapObject.d.ts +4 -0
  508. package/types/helpers/mapObject.d.ts.map +1 -0
  509. package/types/helpers/mutationLifecycle.d.ts +44 -0
  510. package/types/helpers/mutationLifecycle.d.ts.map +1 -0
  511. package/types/helpers/mutationLifecycle.test.d.ts +2 -0
  512. package/types/helpers/mutationLifecycle.test.d.ts.map +1 -0
  513. package/types/helpers/platform.d.ts +3 -0
  514. package/types/helpers/platform.d.ts.map +1 -0
  515. package/types/helpers/platform.native.d.ts +3 -0
  516. package/types/helpers/platform.native.d.ts.map +1 -0
  517. package/types/helpers/recoverZeroClient.d.ts +13 -9
  518. package/types/helpers/recoverZeroClient.d.ts.map +1 -1
  519. package/types/helpers/sleep.d.ts +2 -0
  520. package/types/helpers/sleep.d.ts.map +1 -0
  521. package/types/helpers/time.d.ts +28 -0
  522. package/types/helpers/time.d.ts.map +1 -0
  523. package/types/helpers/tuple.d.ts +2 -0
  524. package/types/helpers/tuple.d.ts.map +1 -0
  525. package/types/index.d.ts +3 -1
  526. package/types/index.d.ts.map +1 -1
  527. package/types/instanceRegistry.d.ts +1 -0
  528. package/types/instanceRegistry.d.ts.map +1 -1
  529. package/types/multi.d.ts +23 -1
  530. package/types/multi.d.ts.map +1 -1
  531. package/types/mutations.d.ts +1 -1
  532. package/types/mutations.d.ts.map +1 -1
  533. package/types/run.d.ts.map +1 -1
  534. package/types/server.d.ts +12 -8
  535. package/types/server.d.ts.map +1 -1
  536. package/types/state.d.ts +1 -1
  537. package/types/state.d.ts.map +1 -1
  538. package/types/types.d.ts +23 -1
  539. package/types/types.d.ts.map +1 -1
  540. package/types/vite-plugin.d.ts.map +1 -1
  541. package/types/where.d.ts.map +1 -1
  542. package/lint/ssr-guards.js +0 -165
  543. package/test-fixtures/server-return-types.ts +0 -58
  544. package/test-fixtures/tsconfig.json +0 -13
  545. package/tsconfig.json +0 -26
  546. package/vitest.config.ts +0 -8
@@ -1,8 +1,9 @@
1
1
  import { createSchema, string, table } from '@rocicorp/zero'
2
- import { createEmitter } from '@take-out/helpers'
3
2
  import { describe, expect, test, vi } from 'vitest'
3
+
4
4
  import { combineZeroClients } from './combineZeroClients'
5
5
  import { createZeroClient } from './createZeroClient'
6
+ import { createEmitter } from './helpers/emitter'
6
7
  import { runWithContext } from './helpers/mutatorContext'
7
8
  import {
8
9
  getInstanceForNamespace,
@@ -13,6 +14,7 @@ import { registerQuery } from './queryRegistry'
13
14
  import { run } from './run'
14
15
  import { setRunner, type ZeroRunner } from './zeroRunner'
15
16
  import { zql } from './zql'
17
+
16
18
  import type { ZeroEvent } from './types'
17
19
  import type { AnyQueryRegistry, Query } from '@rocicorp/zero'
18
20
  import type { ReactNode } from 'react'
@@ -107,8 +109,8 @@ describe('multi-instance namespace dispatch', () => {
107
109
  can: async () => {},
108
110
  tx: { run: txRun },
109
111
  } as any,
110
- () => run(byId, { id: '1' }),
111
- ),
112
+ () => run(byId, { id: '1' })
113
+ )
112
114
  ).rejects.toThrow(/run\(namedQuery\) cannot be used inside a Zero mutation/)
113
115
 
114
116
  expect(ownerRunner).not.toHaveBeenCalled()
@@ -129,8 +131,8 @@ describe('multi-instance namespace dispatch', () => {
129
131
  can: async () => {},
130
132
  tx: { run: txRun },
131
133
  } as any,
132
- () => run(byId, { id: '1' }),
133
- ),
134
+ () => run(byId, { id: '1' })
135
+ )
134
136
  ).resolves.toEqual({ from: 'owner' })
135
137
 
136
138
  expect(ownerRunner).toHaveBeenCalledTimes(1)
@@ -152,8 +154,8 @@ describe('multi-instance namespace dispatch', () => {
152
154
  can: async () => {},
153
155
  tx: { run: txRun },
154
156
  } as any,
155
- () => run(query),
156
- ),
157
+ () => run(query)
158
+ )
157
159
  ).resolves.toEqual({ from: 'tx' })
158
160
 
159
161
  expect(txRun).toHaveBeenCalledWith(query, undefined)
@@ -195,7 +197,7 @@ describe('multi-instance namespace dispatch', () => {
195
197
  models,
196
198
  groupedQueries: {},
197
199
  instanceName: 'mdl-b',
198
- }),
200
+ })
199
201
  ).toThrow(/already claimed/)
200
202
  })
201
203
  })
@@ -211,10 +213,18 @@ describe('multi-instance isolation', () => {
211
213
 
212
214
  const seenByB: Array<ZeroEvent | null> = []
213
215
  b.zeroEvents.listen((event) => seenByB.push(event))
214
- a.zeroEvents.emit({ type: 'error', message: 'a-only' })
216
+ a.zeroEvents.emit({
217
+ type: 'error',
218
+ reasonKey: 'connection-error',
219
+ message: 'a-only',
220
+ })
215
221
 
216
222
  expect(seenByB).toEqual([])
217
- expect(a.zeroEvents.value).toEqual({ type: 'error', message: 'a-only' })
223
+ expect(a.zeroEvents.value).toEqual({
224
+ type: 'error',
225
+ reasonKey: 'connection-error',
226
+ message: 'a-only',
227
+ })
218
228
  expect(b.zeroEvents.value).toBe(null)
219
229
  })
220
230
 
@@ -345,7 +355,7 @@ describe('combineZeroClients facade', () => {
345
355
  expect(b.useQuery).not.toHaveBeenCalled()
346
356
 
347
357
  expect(() => combineZeroClients(a, b, { inner: 'nope' })).toThrow(
348
- /not one of the passed clients/,
358
+ /not one of the passed clients/
349
359
  )
350
360
  })
351
361
 
@@ -357,8 +367,16 @@ describe('combineZeroClients facade', () => {
357
367
  const seen: Array<ZeroEvent | null> = []
358
368
  combined.zeroEvents.listen((event) => seen.push(event))
359
369
 
360
- a.zeroEvents.emit({ type: 'error', message: 'from-a' })
361
- b.zeroEvents.emit({ type: 'error', message: 'from-b' })
370
+ a.zeroEvents.emit({
371
+ type: 'error',
372
+ reasonKey: 'connection-error',
373
+ message: 'from-a',
374
+ })
375
+ b.zeroEvents.emit({
376
+ type: 'error',
377
+ reasonKey: 'connection-error',
378
+ message: 'from-b',
379
+ })
362
380
 
363
381
  const messageOf = (event: ZeroEvent | null) =>
364
382
  event?.type === 'error' ? event.message : undefined
@@ -185,7 +185,7 @@ test('outer-instance query reads the OUTER store under nested providers', async
185
185
  <project.ProvideZero server={null} userID="t1-prj">
186
186
  <ControlUserProbe id="u1" />
187
187
  </project.ProvideZero>
188
- </control.ProvideZero>,
188
+ </control.ProvideZero>
189
189
  )
190
190
  await waitFor(() => probe.renders > 0, 'probe mount')
191
191
 
@@ -241,7 +241,7 @@ test('StrictMode: direct views survive the effect double-invoke', async () => {
241
241
  <ControlUserProbe id="u4" />
242
242
  </project.ProvideZero>
243
243
  </control.ProvideZero>
244
- </StrictMode>,
244
+ </StrictMode>
245
245
  )
246
246
  await waitFor(() => probe.renders > 0, 'probe mount')
247
247
 
@@ -1,38 +1,73 @@
1
+ import { createSchema, string, table } from '@rocicorp/zero'
1
2
  import { describe, expect, test } from 'vitest'
2
3
 
3
- import { assertZeroInstancePartition } from './multi'
4
+ import { createZeroClients } from './multi'
4
5
 
5
- describe('assertZeroInstancePartition', () => {
6
- const control = { user: 1, workspace: 1 }
7
- const project = { message: 1, thread: 1 }
6
+ const schema = createSchema({
7
+ tables: [table('message').columns({ id: string() }).primaryKey('id')],
8
+ })
8
9
 
9
- test('passes when every namespace belongs to exactly one partition', () => {
10
- expect(() =>
11
- assertZeroInstancePartition(
12
- 'query namespace',
13
- { user: {}, workspace: {}, message: {}, thread: {} },
14
- { control, project },
15
- ),
16
- ).not.toThrow()
10
+ describe('createZeroClients', () => {
11
+ test('builds generated partitions with default as the primary client', () => {
12
+ const instances = {
13
+ default: {
14
+ schema,
15
+ queries: { account: { current: () => ({}) as never } },
16
+ models: {},
17
+ tables: ['account'],
18
+ syncTables: ['account'],
19
+ supportTables: [],
20
+ scope: null,
21
+ defaultVisibility: null,
22
+ },
23
+ project: {
24
+ schema,
25
+ queries: { message: { all: () => ({}) as never } },
26
+ models: {},
27
+ tables: ['message'],
28
+ syncTables: ['message'],
29
+ supportTables: [],
30
+ scope: 'projectId',
31
+ defaultVisibility: (value: string) => ({ column: 'projectId', value }),
32
+ },
33
+ } as const
34
+
35
+ const result = createZeroClients(instances)
36
+
37
+ expect(Object.keys(result.clients)).toEqual(['project', 'default'])
38
+ expect(result.clients.default.instanceName).toBe('default')
39
+ expect(result.clients.project.instanceName).toBe('project')
40
+ expect(result.providers.default).toBe(result.clients.default.ProvideZero)
41
+ expect(result.providers.project).toBe(result.clients.project.ProvideZero)
42
+ expect(result.combined.run).toBeTypeOf('function')
17
43
  })
18
44
 
19
- test('throws on a namespace missing from every partition (the planGrant drift)', () => {
20
- expect(() =>
21
- assertZeroInstancePartition(
22
- 'query namespace',
23
- { user: {}, planGrant: {} },
24
- { control, project },
25
- ),
26
- ).toThrow(/planGrant.*missing from the instance partition/)
45
+ test('requires at least one generated instance', () => {
46
+ expect(() => createZeroClients({})).toThrow(/at least one instance/)
27
47
  })
28
48
 
29
- test('throws on a namespace claimed by more than one partition', () => {
49
+ test('replaces an existing partition atomically when a namespace moves', () => {
50
+ const entry = (queries: Record<string, Record<string, () => never>>) => ({
51
+ schema,
52
+ queries,
53
+ models: {},
54
+ tables: Object.keys(queries),
55
+ syncTables: Object.keys(queries),
56
+ supportTables: [],
57
+ scope: null,
58
+ defaultVisibility: null,
59
+ })
60
+
61
+ createZeroClients({
62
+ default: entry({ movedNamespace: { before: () => ({}) as never } }),
63
+ project: entry({ stableProject: { before: () => ({}) as never } }),
64
+ })
65
+
30
66
  expect(() =>
31
- assertZeroInstancePartition(
32
- 'query namespace',
33
- { user: {} },
34
- { control, project: { user: 1 } },
35
- ),
36
- ).toThrow(/user.*more than one instance partition/)
67
+ createZeroClients({
68
+ default: entry({ stableDefault: { after: () => ({}) as never } }),
69
+ project: entry({ movedNamespace: { after: () => ({}) as never } }),
70
+ })
71
+ ).not.toThrow()
37
72
  })
38
73
  })
package/src/mutations.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { IS_SERVER_RUNTIME } from '@take-out/helpers'
1
+ import { IS_SERVER_RUNTIME } from './helpers/platform'
2
2
  import { setMutationsPermissions } from './modelRegistry'
3
3
 
4
- import type { TableBuilderWithColumns } from '@rocicorp/zero'
5
4
  import type {
6
5
  MutatorContext,
7
6
  Schema,
@@ -10,6 +9,7 @@ import type {
10
9
  TableUpdateRow,
11
10
  Where,
12
11
  } from './types'
12
+ import type { TableBuilderWithColumns } from '@rocicorp/zero'
13
13
 
14
14
  // derive a TableBuilderWithColumns from the global schema by table name
15
15
  type SchemaTableBuilder<TName extends TableName> = TableBuilderWithColumns<
@@ -37,7 +37,7 @@ function proxyRegistry(): Map<string, any> {
37
37
  // returns the SAME proxy object on subsequent calls so HMR works
38
38
  function getOrCreateMutationProxy<T extends Record<string, Function>>(
39
39
  tableName: string,
40
- implementations: T,
40
+ implementations: T
41
41
  ): T {
42
42
  // merge with any prior registration for this table: multiple modules may
43
43
  // register mutators on the same table (a seed.ts alongside the table's own
@@ -47,7 +47,7 @@ function getOrCreateMutationProxy<T extends Record<string, Function>>(
47
47
  const prior = mutationRegistry().get(tableName)
48
48
  mutationRegistry().set(
49
49
  tableName,
50
- prior ? { ...prior, ...implementations } : implementations,
50
+ prior ? { ...prior, ...implementations } : implementations
51
51
  )
52
52
 
53
53
  // return existing proxy if we have one (HMR case)
@@ -117,11 +117,11 @@ type MutationsWithCRUD<Table extends GenericTable, Mutations extends MutationBui
117
117
  }
118
118
 
119
119
  export function mutations<Mutations extends MutationBuilders>(
120
- mutations: Mutations,
120
+ mutations: Mutations
121
121
  ): Mutations
122
122
  export function mutations<Table extends GenericTable, Permissions extends Where>(
123
123
  table: Table,
124
- permissions: Permissions,
124
+ permissions: Permissions
125
125
  ): MutationsWithCRUD<Table, {}>
126
126
  export function mutations<
127
127
  Table extends GenericTable,
@@ -130,12 +130,12 @@ export function mutations<
130
130
  >(
131
131
  table: Table,
132
132
  permissions: Permissions,
133
- mutations: Mutations,
133
+ mutations: Mutations
134
134
  ): MutationsWithCRUD<Table, Mutations>
135
135
  // string-based overloads (for drizzle-zero derived schemas where table builders aren't available)
136
136
  export function mutations<TName extends TableName, Permissions extends Where>(
137
137
  tableName: TName,
138
- permissions: Permissions,
138
+ permissions: Permissions
139
139
  ): MutationsWithCRUD<SchemaTableBuilder<TName>, {}>
140
140
  export function mutations<
141
141
  TName extends TableName,
@@ -144,7 +144,7 @@ export function mutations<
144
144
  >(
145
145
  tableName: TName,
146
146
  permissions: Permissions,
147
- mutations: Mutations,
147
+ mutations: Mutations
148
148
  ): MutationsWithCRUD<SchemaTableBuilder<TName>, Mutations>
149
149
  export function mutations<
150
150
  Table extends GenericTable,
@@ -152,7 +152,7 @@ export function mutations<
152
152
  >(
153
153
  table: Table | string | Mutations,
154
154
  permissions?: Where,
155
- mutations?: Mutations,
155
+ mutations?: Mutations
156
156
  ): Mutations {
157
157
  if (permissions) {
158
158
  const tableName =
@@ -17,12 +17,12 @@
17
17
  // stability is what keeps useId stable.
18
18
 
19
19
  import { createSchema, string, table } from '@rocicorp/zero'
20
- import { IS_SERVER, IS_SERVER_RUNTIME } from '@take-out/helpers'
21
20
  import { useId, type ReactNode } from 'react'
22
21
  import { renderToString } from 'react-dom/server'
23
22
  import { expect, test } from 'vitest'
24
23
 
25
24
  import { createZeroClient } from './createZeroClient'
25
+ import { IS_SERVER, IS_SERVER_RUNTIME } from './helpers/platform'
26
26
 
27
27
  const todoTable = table('todo')
28
28
  .columns({ id: string(), title: string() })
@@ -31,7 +31,7 @@ export function resolveQuery<Schema extends ZeroSchema>({
31
31
  })
32
32
  throw new Error(
33
33
  `Query function '${fnName}' not registered. ` +
34
- `Ensure it is exported from a queries file and passed to createZeroClient via groupedQueries.`,
34
+ `Ensure it is exported from a queries file and passed to createZeroClient via groupedQueries.`
35
35
  )
36
36
  }
37
37
 
@@ -43,7 +43,7 @@ export function resolveQuery<Schema extends ZeroSchema>({
43
43
  if (!customQuery) {
44
44
  throw new Error(
45
45
  `CustomQuery '${queryName}' not found. ` +
46
- `Check that the query is exported and the namespace/name matches.`,
46
+ `Check that the query is exported and the namespace/name matches.`
47
47
  )
48
48
  }
49
49
 
package/src/run.ts CHANGED
@@ -1,6 +1,6 @@
1
+ import { isInZeroMutation, mutatorContext } from './helpers/mutatorContext'
1
2
  import { getInstanceForQueryFn } from './instanceRegistry'
2
3
  import { resolveQuery, type PlainQueryFn } from './resolveQuery'
3
- import { isInZeroMutation, mutatorContext } from './helpers/mutatorContext'
4
4
  import { getAmbientRunner, getRunner } from './zeroRunner'
5
5
 
6
6
  import type {
@@ -19,7 +19,7 @@ export function setCustomQueries(queries: AnyQueryRegistry) {
19
19
  function getCustomQueries(): AnyQueryRegistry {
20
20
  if (!customQueriesRef) {
21
21
  throw new Error(
22
- 'Custom queries not initialized. Ensure client or server bindings have been created.',
22
+ 'Custom queries not initialized. Ensure client or server bindings have been created.'
23
23
  )
24
24
  }
25
25
  return customQueriesRef
@@ -33,7 +33,7 @@ export function run<
33
33
  TReturn,
34
34
  >(
35
35
  query: Query<TTable, Schema, TReturn>,
36
- mode?: 'complete',
36
+ mode?: 'complete'
37
37
  ): Promise<HumanReadable<TReturn>>
38
38
 
39
39
  export function run<
@@ -44,7 +44,7 @@ export function run<
44
44
  >(
45
45
  fn: PlainQueryFn<TArg, Query<TTable, Schema, TReturn>>,
46
46
  params: TArg,
47
- mode?: 'complete',
47
+ mode?: 'complete'
48
48
  ): Promise<HumanReadable<TReturn>>
49
49
 
50
50
  export function run<
@@ -53,13 +53,13 @@ export function run<
53
53
  TReturn,
54
54
  >(
55
55
  fn: PlainQueryFn<void, Query<TTable, Schema, TReturn>>,
56
- mode?: 'complete',
56
+ mode?: 'complete'
57
57
  ): Promise<HumanReadable<TReturn>>
58
58
 
59
59
  export function run(
60
60
  queryOrFn: any,
61
61
  paramsOrMode?: any,
62
- modeArg?: 'complete',
62
+ modeArg?: 'complete'
63
63
  ): Promise<any> {
64
64
  const hasParams = modeArg !== undefined || (paramsOrMode && paramsOrMode !== 'complete')
65
65
  const params = hasParams ? paramsOrMode : undefined
@@ -79,7 +79,7 @@ export function run(
79
79
  const inMutation = isInZeroMutation()
80
80
  if (inMutation && mutatorContext().environment === 'server') {
81
81
  throw new Error(
82
- 'run(namedQuery) cannot be used inside a Zero mutation. Use tx.run(zql...) for transactional mutation reads.',
82
+ 'run(namedQuery) cannot be used inside a Zero mutation. Use tx.run(zql...) for transactional mutation reads.'
83
83
  )
84
84
  }
85
85
 
@@ -1,15 +1,14 @@
1
1
  import { createSchema, defineQueries, defineQuery, string, table } from '@rocicorp/zero'
2
2
  import * as v from 'valibot'
3
- import { describe, expect, test } from 'vitest'
3
+ import { describe, expect, test, vi } from 'vitest'
4
4
 
5
+ import { getScopedAuthData } from './helpers/mutatorContext'
5
6
  import {
6
- authDataToClaims,
7
7
  createZeroServerBindings,
8
8
  type ZeroServerExecutor,
9
9
  type ZeroServerMutatorRegistry,
10
10
  type ZeroServerTransaction,
11
11
  } from './server'
12
- import { getScopedAuthData } from './helpers/mutatorContext'
13
12
  import { zql } from './zql'
14
13
 
15
14
  import type { AuthData, MutatorContext } from './types'
@@ -31,7 +30,7 @@ const schema = createSchema({
31
30
  const queries = defineQueries({
32
31
  project: {
33
32
  byOwner: defineQuery(v.object({ ownerId: v.string() }), ({ args }) =>
34
- zql.project.where('ownerId', args.ownerId),
33
+ zql.project.where('ownerId', args.ownerId)
35
34
  ),
36
35
  },
37
36
  })
@@ -40,9 +39,10 @@ type ProjectRow = { id: string; ownerId: string; name: string }
40
39
 
41
40
  function createTestExecutor(
42
41
  mutators: ZeroServerMutatorRegistry<typeof schema>,
43
- rows: ProjectRow[],
42
+ rows: ProjectRow[]
44
43
  ) {
45
44
  const scheduledBackground: Promise<void>[] = []
45
+ const queryClaims: unknown[] = []
46
46
  const tx = {
47
47
  mutate: {
48
48
  project: {
@@ -78,12 +78,13 @@ function createTestExecutor(
78
78
  async transaction(_claims, work) {
79
79
  return work(tx)
80
80
  },
81
- async query(_claims, work) {
81
+ async query(claims, work) {
82
+ queryClaims.push(claims)
82
83
  return work(tx)
83
84
  },
84
85
  }
85
86
 
86
- return { executor, scheduledBackground }
87
+ return { executor, queryClaims, scheduledBackground }
87
88
  }
88
89
 
89
90
  describe('createZeroServerBindings', () => {
@@ -114,7 +115,7 @@ describe('createZeroServerBindings', () => {
114
115
  id: 'project-1',
115
116
  ownerId: 'anon',
116
117
  name: 'sneaky',
117
- }),
118
+ })
118
119
  ).rejects.toThrow('not authenticated')
119
120
  expect(seenAuthData).toBe(null)
120
121
  expect(rows).toEqual([])
@@ -136,7 +137,7 @@ describe('createZeroServerBindings', () => {
136
137
  mutate: {
137
138
  create: async (
138
139
  { authData, server, tx }: MutatorContext,
139
- value: ProjectRow,
140
+ value: ProjectRow
140
141
  ) => {
141
142
  mutationRuns++
142
143
  expect(authData?.id).toBe('user-1')
@@ -145,7 +146,7 @@ describe('createZeroServerBindings', () => {
145
146
  async () => {
146
147
  barrierRuns++
147
148
  },
148
- { barrier: true },
149
+ { barrier: true }
149
150
  )
150
151
  server?.enqueueTask(async () => {
151
152
  backgroundRuns++
@@ -166,11 +167,14 @@ describe('createZeroServerBindings', () => {
166
167
  })
167
168
 
168
169
  expect(Object.keys(bindings.mutators)).toEqual(['project|create'])
169
- const { executor, scheduledBackground } = createTestExecutor(bindings.mutators, rows)
170
+ const { executor, queryClaims, scheduledBackground } = createTestExecutor(
171
+ bindings.mutators,
172
+ rows
173
+ )
170
174
  const server = bindings.server(executor)
171
175
  await server.mutate.project.create(
172
176
  { id: 'project-1', ownerId: 'user-1', name: 'first' },
173
- { authData: { id: 'user-1' } },
177
+ { authData: { id: 'user-1' } }
174
178
  )
175
179
 
176
180
  expect(rows).toEqual([{ id: 'project-1', ownerId: 'user-1', name: 'first' }])
@@ -181,14 +185,109 @@ describe('createZeroServerBindings', () => {
181
185
  expect(backgroundRuns).toBe(1)
182
186
  expect(backgroundAuth).toBe('user-1')
183
187
 
184
- const claims = authDataToClaims({ id: 'user-1' })
185
- const ast = await bindings.resolveQuery(
186
- 'project|byOwner',
187
- [{ ownerId: 'user-1' }],
188
- claims,
189
- )
188
+ const ast = await bindings.resolveQuery('project|byOwner', [{ ownerId: 'user-1' }], {
189
+ id: 'user-1',
190
+ })
190
191
  expect(JSON.stringify(ast)).toContain('ownerId')
191
192
  expect(JSON.stringify(ast)).toContain('user-1')
192
193
  expect(validatedQueryAuth).toBe('user-1')
194
+
195
+ await server.query({ id: 'user-1' }, () => zql.project)
196
+ expect(queryClaims).toEqual([{ userID: 'user-1', authData: { id: 'user-1' } }])
197
+ })
198
+
199
+ test('enqueues typed actions through the configured local executor', async () => {
200
+ type Action =
201
+ | { type: 'project.provisionNamespace'; projectId: string }
202
+ | { type: 'project.invalidateAccess'; projectId: string }
203
+
204
+ const executed: Action[] = []
205
+ let releaseBackground: () => void = () => {}
206
+ const backgroundGate = new Promise<void>((resolve) => {
207
+ releaseBackground = resolve
208
+ })
209
+ const bindings = createZeroServerBindings({
210
+ schema,
211
+ models: {
212
+ project: {
213
+ mutate: {
214
+ create: async ({ server }: MutatorContext, value: ProjectRow) => {
215
+ const enqueueAction = server?.enqueueAction as (
216
+ action: Action,
217
+ options?: { barrier?: boolean }
218
+ ) => void
219
+ enqueueAction(
220
+ { type: 'project.provisionNamespace', projectId: value.id },
221
+ { barrier: true }
222
+ )
223
+ enqueueAction({ type: 'project.invalidateAccess', projectId: value.id })
224
+ },
225
+ },
226
+ },
227
+ },
228
+ createServerActions: () => ({}),
229
+ actions: {
230
+ async execute(action: Action) {
231
+ if (action.type === 'project.invalidateAccess') await backgroundGate
232
+ executed.push(action)
233
+ },
234
+ },
235
+ })
236
+ const { executor, scheduledBackground } = createTestExecutor(bindings.mutators, [])
237
+
238
+ await executor.execute(
239
+ 'project|create',
240
+ { id: 'project-1', ownerId: 'user-1', name: 'first' },
241
+ { userID: 'user-1', authData: { id: 'user-1' } }
242
+ )
243
+ expect(executed).toEqual([
244
+ { type: 'project.provisionNamespace', projectId: 'project-1' },
245
+ ])
246
+ releaseBackground()
247
+ await Promise.all(scheduledBackground)
248
+ expect(executed).toEqual([
249
+ { type: 'project.provisionNamespace', projectId: 'project-1' },
250
+ { type: 'project.invalidateAccess', projectId: 'project-1' },
251
+ ])
252
+ })
253
+
254
+ test('selects remote dispatch once and never falls back to local execution', async () => {
255
+ type Action = { type: 'durable.run'; operationId: string }
256
+ const execute = vi.fn(async (_action: Action) => {})
257
+ const dispatchRemote = vi.fn(async (_action: Action) => {
258
+ throw new Error('remote unavailable')
259
+ })
260
+ const bindings = createZeroServerBindings({
261
+ schema,
262
+ models: {
263
+ project: {
264
+ mutate: {
265
+ create: async ({ server }: MutatorContext) => {
266
+ const enqueueAction = server?.enqueueAction as (
267
+ action: Action,
268
+ options?: { barrier?: boolean }
269
+ ) => void
270
+ enqueueAction(
271
+ { type: 'durable.run', operationId: 'operation-1' },
272
+ { barrier: true }
273
+ )
274
+ },
275
+ },
276
+ },
277
+ },
278
+ createServerActions: () => ({}),
279
+ actions: { execute, dispatchRemote },
280
+ })
281
+ const { executor } = createTestExecutor(bindings.mutators, [])
282
+
283
+ await expect(
284
+ executor.execute(
285
+ 'project|create',
286
+ { id: 'project-1', ownerId: 'user-1', name: 'first' },
287
+ { userID: 'user-1', authData: { id: 'user-1' } }
288
+ )
289
+ ).rejects.toThrow('remote unavailable')
290
+ expect(dispatchRemote).toHaveBeenCalledOnce()
291
+ expect(execute).not.toHaveBeenCalled()
193
292
  })
194
293
  })